讓我們說我有三個文本框: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