2010-04-07 21 views
2

让我们说我有三个文本框:TextBox1,TextBox2,TextBox3。通常情况下,如果我想改变文本,例如我会把TextBox1.Text =“无论”等等。对于我现在正在做的事情,我想(TextBox &“i”)。Text。这显然不是我需要使用的语法,我只是将它用作我需要做的一个示例。那么我该如何做这样的事情呢?我这样做的主要原因是用循环来减少代码。如何以编程方式构造对象引用?

请记住,我并没有真正改变文本框的文本,我只是用它作为例子来说明问题。

回答

0

当你动态地创建你的文本框时,你可以使用一个更容易的文本框数组。
但是也可以使用反射,太:

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 = ""; 
    } 
} 
+0

这里反映太复杂了,只是'Controls.OfType ()'will do =) – vittore 2010-04-07 16:23:04

+0

@vittore是的,你得到我的upvote! – tanascius 2010-04-07 16:24:25

2

使用数组的索引来访问文本框对象:

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"; 
} 
0

由于目标是减少代码大小,不,你不能这样做。靠近你正在努力实现将是什么:

  • 保存控件列表或数组
  • 循环的列表或数组

    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 = ""; 
    } 
} 
0

我会推荐一般不这样做。通常,最好将对象引用放入集合中,然后处理集合 - 或者沿着这些行使用其他方法。

然而,可以通过反射来做到这一点(虽然它的速度慢):

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"; 
} 
1
this.Controls.OfType<TextBox>().First(r => r.ID == "textbox1").Text = "whatever"; 

如果你当然知道,那个文本框ID为 'TextBox1的' 存在

foreach (var tb in this.Controls.OfType<TextBox>()) { 
    tb.Text ="whatever"; 
} 
+0

是否在Visual Studio中工作** ** 2005年? – dtb 2010-04-07 16:25:59

+0

后来没有lambda应该可以工作 – vittore 2010-04-07 16:35:09

相关问题