Добавление разных элементов управления с одинаковыми именами в C # Windows Form - PullRequest
1 голос
/ 28 ноября 2010

Я работаю в приложении C # Windows Forms, в котором я добавляю 3 разных элемента управления с одинаковыми именами (кнопка, текстовое поле и метка) в мою форму.

Почему в button4_Click есть ошибка?

КОД:

 private void button1_Click(object sender, EventArgs e)
 {
        TextBox myControl = new TextBox();
        myControl.Name = "myControl";
        this.Controls.Add(myControl);
 }

 private void button2_Click(object sender, EventArgs e)
 {
        Button myControl = new Button();
        myControl.Name = "myControl";
        this.Controls.Add(myControl);
 }

 private void button3_Click(object sender, EventArgs e)
 {
        Label myControl = new Label();
        myControl.Name = "myControl";
        this.Controls.Add(myControl);
 }

 private void button4_Click(object sender, EventArgs e)
 {
      ((ComboBox)this.Controls["myControl"]).Text = "myCombo"; // works
      ((TextBox)this.Controls["myControl"]).Text = "myText";   // error
      ((Label)this.Controls["myControl"]).Text = "myLabel";    // error
 }

Ответы [ 3 ]

2 голосов
/ 28 ноября 2010

Индексатор Controls [string] возвращает первый элемент управления, имя которого соответствует строке. Он будет поражен вашим кодом, но вы, вероятно, уже добавили ComboBox в форму с тем же именем. Следующие операторы идут kaboom, потому что вы не можете привести ComboBox к TextBox.

Конечно, постарайтесь сделать что-то вменяемое, дайте этим элементам управления разные имена.

0 голосов
/ 28 ноября 2010

Вот одна идея, которая может вам помочь:

 void SetControlText(Type controlType, string controlName, string text) {
      foreach (var ctl in this.Controls.OfType<Control>()) {
        if (ctl.GetType() == controlType && ctl.Name == controlName) {
          ctl.Text = text;

          break;
        }
      }
    }

Или только с LINQ:

var item = this.Controls.OfType<Control>().Where(j => j.GetType() == controlType && j.Name == controlName).FirstOrDefault();
      if (item != null)
        item.Text = text;

Просто вызовите вышеуказанную функцию следующим образом:

SetControlText(typeof(Button), "myButton", "Text was set!");

Эта функция будет перебирать все элементы управления в форме, и когда она находит тип элемента управления, который вы указываете с указанным именем, она обновляет поле элементов управления. Текст.

0 голосов
/ 28 ноября 2010

this.Controls["myControl"] возвращает первый элемент управления с именем myControl.

Это TextBox, а не Label.

Вместо того, чтобы обращаться к ним через коллекцию Controls, вы должны сохранитьваши элементы управления в полях в классе формы (возможно, с использованием List<T> s).

...