让我们说我有三个文本框:TextBox1,TextBox2,TextBox3。通常情况下,如果我想改变文本,例如我会把TextBox1.Text =“无论”等等。对于我现在正在做的事情,我想(TextBox &“i”)。Text。这显然不是我需要使用的语法,我只是将它用作我需要做的一个示例。那么我该如何做这样的事情呢?我这样做的主要原因是用循环来减少代码。如何以编程方式构造对象引用?
请记住,我并没有真正改变文本框的文本,我只是用它作为例子来说明问题。
让我们说我有三个文本框:TextBox1,TextBox2,TextBox3。通常情况下,如果我想改变文本,例如我会把TextBox1.Text =“无论”等等。对于我现在正在做的事情,我想(TextBox &“i”)。Text。这显然不是我需要使用的语法,我只是将它用作我需要做的一个示例。那么我该如何做这样的事情呢?我这样做的主要原因是用循环来减少代码。如何以编程方式构造对象引用?
请记住,我并没有真正改变文本框的文本,我只是用它作为例子来说明问题。
当你动态地创建你的文本框时,你可以使用一个更容易的文本框数组。
但是也可以使用反射,太:
var textBoxes = GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
foreach(var fieldInfo in textBoxes)
{
if(fieldInfo.FieldType == typeof(TextBox))
{
var textBox = (TextBox)fieldInfo.GetValue(this);
textBox.Text = "";
}
}
使用数组的索引来访问文本框对象:
TextBox[] textBoxes = new TextBox[3];
textBoxes[0] = textBox1;
textBoxes[1] = textBox2;
textBoxes[2] = textBox3;
for (int i = 0; i < 3; i++)
{
textBoxes[i].Text = "Whatever";
}
由于目标是减少代码大小,不,你不能这样做。靠近你正在努力实现将是什么:
循环的列表或数组
List<TextBox> myTxts = new List<TextBox> {textBox1, textBox2, textBox3};
foreach(TextBox txt in myTxts) {
txt.Text = "";
}
另一种方法是查询表格的控件集合
foreach(Control ctl in this.Controls) {
var txt = ctl as TextBox;
if (txt != null) {
txt.Text = "";
}
}
我会推荐一般不这样做。通常,最好将对象引用放入集合中,然后处理集合 - 或者沿着这些行使用其他方法。
然而,可以通过反射来做到这一点(虽然它的速度慢):
var fields = this.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Where(f => f.Name.StartsWith("TextBox"));
foreach(var field in fields)
{
TextBox box = field.GetValue(this) as TextBox;
if (box != null)
box.Text = "Whatever";
}
this.Controls.OfType<TextBox>().First(r => r.ID == "textbox1").Text = "whatever";
如果你当然知道,那个文本框ID为 'TextBox1的' 存在
或
foreach (var tb in this.Controls.OfType<TextBox>()) {
tb.Text ="whatever";
}
这里反映太复杂了,只是'Controls.OfType()'will do =) –
vittore
2010-04-07 16:23:04
@vittore是的,你得到我的upvote! – tanascius 2010-04-07 16:24:25