如何以编程方式构造对象引用?

时间:2010-04-07 16:14:29

标签: c# visual-studio-2005

让我们说我有三个文本框:TextBox1,TextBox2,TextBox3。通常,如果我想更改文本,例如我会将TextBox1.Text =“Whatever”等等。对于我现在正在做的事情,我想要像(TextBox&“i”)那样的东西。文本。这显然不是我需要使用的语法我只是将它作为我需要做的一个例子。那么我怎么能这样做呢?我这样做的主要原因是通过循环减少代码。

请记住,我实际上并没有更改文本框的文本,我只是以此为例来说明问题。

5 个答案:

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