有什么方法可以将 link 多个文本框添加到 Window Form App C# 的列表中吗?

Is there any way to link a several Textbox to a list on Window Form App C#?

我正在尝试创建一个 window 表单应用程序,其中包含大约 20 个文本框,分别命名为“TB1”、“TB2”、.... 问题是,如果我必须使用 20 个单独的文本框,那可能真的很烦人。 有什么方法可以创建一个列表,例如:TB[],然后将 TB1 分配给 TB[0],将 TB2 分配给 TB[1],...?

谢谢。

他们已经在列表中;它们必须添加到 ControlCollection 中才能显示在表单中

this.Controls.OfType<TextBox>().Where(tb => tb.Name.StartsWith("TB"))
例如,

会为您提供它们(它会直接在表单上选择所有文本框,名称以 TB 开头。如果您有其他文本框也称为 TBx,但您不想在此中使用,则选择在另一个 属性 中标识您确实想要的控件,或者例如重命名您感兴趣的控件以便您可以通过名称中的模式选择它们)

你可以把它放在 class 级别列表中,在构造函数中:

class YourForm: Form{

  private List<TextBox> _tbList;


  YourForm(){

    InitializeComponent();

    tbList = Controls.OfType<TextBox>().Where(tb => tb.Name.StartsWith("TB")).ToList();

  }

}

然后您可以执行清除所有这些操作:

_tbList.ForEach(tb => tb.Clear());

List用于访问ForEach;这是一个 List 的东西,而不是 LINQ 的东西——普通数组没有 ForEach。如果您使用数组而不是列表,则需要编写例如 foreach(var tb in _tbArray) tb.Clear(); 但整体效果相同

请注意,如果您的文本框在面板或组框中,它们不会在 this.Controls 中,它们会在 thePanel.Controls

注意 2,如果顺序很重要,那么您可以对 TB1、TB2 .. TB9、TB10 等字符串进行正确排序:

Controls.OfType<TextBox>()
  .Where(tb => tb.Name.StartsWith("TB"))
  .OrderBy(tb => (tb.Name.Length, tb.Name))

使用控件集合的替代方法。诀窍是将它们全部连接到一个事件处理程序:

private TextBox[] TB = new TextBox[19];

public void Form_Load(object sender, EventArgs e){
  for (int i  = 0 ; i < 20; i++)
  {
    TB[i].Name = "TB" + i.ToString();
    // Set Location, Visible & Text
    TB[i].Changed += TextBox_Changed;
  }
}

private void TextBox_Changed(object sender, EventArgs e)
{
    TextBox txt = sender as TextBox;
    int i = Convert.ToInt32(txt.Name.Replace("TB", string.Empty));
    Console.Write(TB[i].Text + " has changed");
}