Как программно построить ссылку на объект? - PullRequest
2 голосов
/ 07 апреля 2010

Позвольте мне просто сказать, что у меня есть три текстовых поля: TextBox1, TextBox2, TextBox3.Обычно, если бы я хотел изменить текст, например, я бы поставил TextBox1.Text = "Что угодно" и так далее.Для того, что я делаю сейчас, я хотел бы что-то вроде (TextBox & "я"). Текст.Очевидно, это не тот синтаксис, который мне нужен, я просто использую его как пример того, что мне нужно сделать.Так как я могу сделать что-то подобное?Основная причина, по которой я это делаю, заключается в сокращении кода с помощью цикла.

Пожалуйста, имейте в виду, что я на самом деле не изменяю текст текстовых полей, я просто использую это в качестве примера, чтобы понять суть.

Ответы [ 5 ]

2 голосов
/ 07 апреля 2010

Использование массива для доступа к объектам 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 голос
/ 07 апреля 2010
this.Controls.OfType<TextBox>().First(r => r.ID == "textbox1").Text = "whatever";

если вы, конечно, знаете, это текстовое поле с идентификатором 'textbox1' существует

или

foreach (var tb in  this.Controls.OfType<TextBox>()) {
    tb.Text ="whatever";
}
0 голосов
/ 07 апреля 2010

Когда вы создаете свой 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 = "";
    }
}
0 голосов
/ 07 апреля 2010

Я бы порекомендовал не делать этого вообще.Часто лучше помещать ссылки на ваши объекты в коллекцию, а затем работать над коллекцией - или использовать какой-то другой подход в этом направлении.Отражение:

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";
}
0 голосов
/ 07 апреля 2010

Поскольку цель состоит в том, чтобы уменьшить размер кода, нет, вы не можете этого сделать.Рядом с тем, чего вы пытаетесь достичь, будет:

  • для сохранения элементов управления в списке или массиве
  • зацикливание списка или массива

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