【问题标题】:C# Iterating over known textboxes from arrayC#迭代数组中的已知文本框
【发布时间】:2015-10-01 09:44:22
【问题描述】:

我正在尝试从 string 数组中的字符串迭代文本框

static string[] TextBoxes = {
                             "EmpName",
                             "Sales",
                             "BasePay",
                             "Commission",
                             "GrossPay",
                             "Deductions",
                             "Housing",
                             "FoodAndClothing",
                             "Entertainment",
                             "Misc"
                            };

以上每一项都是表单的一部分,例如 txtHousing 是房屋输入元素。以此类推。

迭代发生在这里

private void btnClear_Click(object sender, EventArgs e)
{
    for (byte i = 0; i < TextBoxes.Length; i++)
    {
        this["txt" + TextBoxes[i]].Text = "";
    }
    this.txtEmpName.Focus();
}

除了这个System.String 得到一个奇怪的“错误”,我们不能从this 对象中调用这样的对象吗?

刚刚阅读了一个说 this.getProperty 可能有效的消息来源,所以我会尝试一下。

错误

无法将 [] 索引应用于“Pay_Calculator.PayCalculator”类型的表达式

【问题讨论】:

  • 我不知道这是否重要,但我只见过int i = 0....。也许这就是问题所在?或许这对我来说只是新事物
  • this["txt" + TextBoxes[i]].Text = ""; 应该做什么? this[string] 应该返回什么? - 没有足够的代码来告诉...
  • 假设清除文本输入所以this.txtDeductions.Text=""。有点认为这里的人已经很清楚了。
  • 而且 byte 比 int 小,所以 byte 更明智。
  • 您的问题是使用 this["myProperty"]。这是一个 JavaScript 约定。你可以让你的类成为一个索引器,但它只接受一个 int 索引来访问属性。 (好吧,显然您可以使用命名索引器进行索引器重载,但我从未使用过它。)

标签: c# arrays


【解决方案1】:

一种解决方案是使用反射/动态对象。

var me = (dynamic) this;
foreach (var name in TextBoxes)
{
  ((TextBox) me['txt' + name]).Value = string.Empty;
}

另一种解决方案是递归所有控件,然后您不需要命名所有文本框。

private void btnClear_Click(object sender, EventArgs e)
{
   ClearTextBox(this);
}

void ClearTextBox (Control c)
{
    var t = c as Textbox;
    if (t != null)
       t.Value = string.Empty;
    foreach (var child in c.Controls)
       ClearTextBox(child);
}

【讨论】:

    【解决方案2】:

    我认为你需要做这样的事情

    private void btnClear_Click(object sender, EventArgs e)
    {
        for (byte i = 0; i < TextBoxes.Length; i++)
        {
            if (this.Controls.ContainsKey("txt" + TextBoxes[i]))
            {
                TextBox txtBox = this.Controls["txt" + TextBoxes[i]] as TextBox;
                if (txtBox != null)
                {
                    // Do your Stuff
                    txtBox.Text = "";
                }
            }
        }
    }
    

    【讨论】:

    • 这仅在TextBoxes 的父级是表单本身时才有效如果TextBox 在面板中,则此操作将失败。
    • 你可以使用byte,它的内存分配更小。
    【解决方案3】:

    假设 WinForms,将 static 更改为 private 并使用 Controls.Find()

        private string[] TextBoxes = {
                             "EmpName",
                             "Sales",
                             "BasePay",
                             "Commission",
                             "GrossPay",
                             "Deductions",
                             "Housing",
                             "FoodAndClothing",
                             "Entertainment",
                             "Misc"
                            };
    
    
        private void btnClear_Click(object sender, EventArgs e)
        {
            foreach (string name in TextBoxes)
            {
                TextBox tb = this.Controls.Find("txt" + name, true).FirstOrDefault() as TextBox;
                if (tb != null)
                {
                    tb.Text = "";
                }
            }
            this.txtEmpName.Focus();
        }
    

    【讨论】:

      【解决方案4】:

      您必须循环访问控件并检查该控件是否为文本框,稍后您可以检查控件的名称以匹配您的数组元素并将其清除。

      你可以关注this例子

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 2018-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多