我的窗口中有10个文本框可以在C#中编写源代码,如同VB6一样,可以访问所有带有索引值的文本框,其中所有文本框都具有相同的名称?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
名称在Winforms中无关紧要。您可以将文本框添加到数组中并以这种方式对其进行索引。
答案 2 :(得分:0)
如果您只需要访问控件,我认为您可以执行以下操作:
public TextBox[] TextBoxesArray
{
get
{
return Controls.OfType<TextBox>().Select(control => control).ToArray();
}
}
我不确定如何扩展此功能以允许从阵列中添加/删除TextBox
es并同时更新Controls
集合。
答案 3 :(得分:0)
没有像VB6那样的“内置”方式。但是,假设您的文本框名为txtBox0
,txtBox1
等,并且少于10个...
如果您使用method shown in this answer,那么您可以编写如下内容:
var myTextBoxes =
this.FilterControls(c => c is TextBox)
.Where(c => c.Name != null && c.Name.StartsWith("txtBox"))
.OrderBy(c => c.Name)
.ToArray();
现在myTextBoxes
应该包含你的数组。