【问题标题】:How to use variable names that are created in a loop and stored in List<string>?如何使用在循环中创建并存储在 List<string> 中的变量名?
【发布时间】:2014-11-05 07:30:49
【问题描述】:

我有一个自动填充文本框名称的 List 对象。现在我想循环浏览所有这些文本框。 如何让 C# 知道 List 中的字符串名称实际上是具有该字符串名称的 TextBox 对象?

        List<string> txtOppsNames = new List<string>(); 
        for (int i = 1; i < numOpps; i++) 
        {
            txtOppsNames.Add("txtOpp" + i);
        }
        foreach (var txtName in txtOppsNames) 
        {
            if (txtName.Text != "")
            {
                // do stuff
            }
        }

当前代码将 txtName 读取为字符串。我希望它读作文本框。

编辑 - 下面的代码包含我的解决方案。

        List<string> txtOppsNames = new List<string>();
        for (int i = 1; i < numOpps; i++) 
        {
            txtOppsNames.Add("txtOpp" + i);
        }
        foreach (var txtName in txtOppsNames)
        {
            TextBox textBox = this.Controls.Find(txtName, true).FirstOrDefault() as TextBox;
            if (textBox.Text != "")
            {
                MessageBox.Show("Thanks Amir Popovich");
            }

        }

【问题讨论】:

  • 你不能那样做,你在什么环境下工作? ASP.NET / Windows 窗体等
  • txtOppsNamesList&lt;string&gt;。为什么你认为你的txtName 可以是TextBox
  • 您可以考虑动态创建文本框(而不是通过设计器),然后将它们添加到 List&lt;TextBox&gt;
  • 我正在使用 Windows 窗体应用程序。我习惯在 VBA 代码中做类似的操作,我很想在这种环境中使用它。
  • 你想对文本做什么?你是如何填写清单的?您可以使用数据绑定或只使用之前建议的TextBox 列表来实现相同的目标。

标签: c# winforms


【解决方案1】:

试试这个:

  List<string> txtOppsNames = new List<string>(); 
        for (int i = 1; i < numOpps; i++) 
        {
            txtOppsNames.Add("txtOpp" + i);
        }
        foreach (var txtName in txtOppsNames) 
        {
          var cntrl= FindControl(txtName);
           if (cntrl!=null && cntrl is TextBox)
              // do something with 
              ((TextBox)cntrl)
       }

【讨论】:

    【解决方案2】:

    使用Control.ControlCollection.Find:

    string textBoxName = "txtOpp1";
    TextBox textBox = this.Controls.Find(textBoxName, true).FirstOrDefault() as TextBox;
    

    在你的情况下:

    List<string> txtOppsNames = new List<string>(); 
    for (int i = 1; i < numOpps; i++) 
    {
        txtOppsNames.Add("txtOpp" + i);
    }
    foreach (var txtName in txtOppsNames) 
    {
       var control = this.Controls.Find(txtName, true).FirstOrDefault();
       if(control != null && control is TextBox)
       {
          TextBox textBox = control as TextBox;
          if(textBox.Text != string.Empty)
          {
              //logic
          }
       } 
     }
    

    【讨论】:

    • 我喜欢@Royi 的回答,因为它已经过测试以确保它是一个文本框,但我也喜欢你的textBox.Text !=string.Empty.
    【解决方案3】:

    假设是Winform,好像没有什么好办法。

    但你可以使用Loop through Textboxes

    一旦你有了文本框集合,用你的字符串检查名字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-23
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 2012-01-05
      相关资源
      最近更新 更多