0

可能重复:
如何在 C# 2010.NET 中制作控件数组?

我的窗口窗体中有 10 个文本框我可以像在 VB6 中一样在 C# 中编写源代码来访问所有具有相同名称的文本框的索引值的文本框吗?

4

4 回答 4

4

不支持 VB6 样式的控件数组,但您可以通过将每个控件添加到单独声明的数组或列表中轻松完成此操作。

private List<Textbox> txtSameName = new List<Textbox>();

在构造函数中,在 InitializeComponent 之后:

txtSameName.Add(txtOne);
txtSameName.Add(txtTwo);
txtSameName.Add(txtThree);
txtSameName.Add(txtFour);

然后您可以按索引或通过 foreach 进行迭代:

for (int 1 = 0; i < txtSameName.Length; i++)
{
   txtSameName[i].Text = string.empty;
}

连接一个公共处理程序:

foreach (Textbox tb in txtSameName)
{
   tb.TextChanged += new EventHandler(txtSameName_TextChanged);
}

然后是一个处理程序,如下所示:

private void txtSameName_TextChanged(object sender, EventArgs e)
{
   Textbox tb = sender as Textbox;
   tb.BackColor = Colors.Yellow;
}
于 2012-09-10T18:23:40.327 回答
0

如果您只需要访问控件,我认为您可以执行以下操作:

public TextBox[] TextBoxesArray
{
    get
    {
        return Controls.OfType<TextBox>().Select(control => control).ToArray();
    }
}

我不确定如何扩展它以允许TextBox从数组中添加/删除 es 并同时更新Controls集合。

于 2012-09-10T18:36:24.377 回答
0

没有像 VB6 那样的“内置”方式。但是,假设您的文本框命名为txtBox0,txtBox1等,并且少于 10...

如果您使用此答案中显示的方法,那么您可以编写如下内容:

var myTextBoxes =
    this.FilterControls(c => c is TextBox)
        .Where(c => c.Name != null && c.Name.StartsWith("txtBox"))
        .OrderBy(c => c.Name)
        .ToArray();

现在myTextBoxes应该包含您的数组。

于 2012-09-10T22:42:49.467 回答
0

名称在 Winforms 中真的无关紧要。您可以将文本框添加到数组并以这种方式对其进行索引。

于 2012-09-10T18:18:10.827 回答