让我们说我有三个文本框:TextBox1,TextBox2,TextBox3。通常,如果我想更改文本,例如我会将TextBox1.Text =“Whatever”等等。对于我现在正在做的事情,我想要像(TextBox&“i”)那样的东西。文本。这显然不是我需要使用的语法我只是将它作为我需要做的一个例子。那么我怎么能这样做呢?我这样做的主要原因是通过循环减少代码。
请记住,我实际上并没有更改文本框的文本,我只是以此为例来说明问题。
答案 0 :(得分:2)
使用数组按索引访问TextBox对象:
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";
}
答案 1 :(得分: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";
}
答案 2 :(得分: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 = "";
}
}
答案 3 :(得分:0)
我建议不要这样做。通常,最好将对象引用放入集合中,然后处理集合 - 或者使用其他方法。
然而,可以通过Reflection:
来做到这一点(虽然它很慢)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";
}
答案 4 :(得分:0)
当您动态创建TextBox时,您可以使用更容易的TextBoxes数组 但是也可以使用反射:
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 = "";
}
}