2010-04-07 23 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

相關問題