Как обрабатывать динамические графические интерфейсы в .net - PullRequest
2 голосов
/ 15 июля 2009

Я столкнулся с проблемой, которая, вероятно, встречается довольно часто, но никогда здесь не обсуждалась.

В моем графическом интерфейсе я добавляю элементы управления в цикле for в Flowpanellayout. Дело в том, чтобы отображать «отчеты» из базы данных. Это должно быть динамично, потому что количество отчетов может различаться изо дня в день.


Псевдокод Добавление элементов графического интерфейса:

for(int i = 0; i < reports.Count; i++)
{
    TextBox textboxPerson = new TextBox();
    textboxPerson.Name = "TextboxName" + i;
    textboxPerson.Text = reports[i].Name;
    textboxPerson.TextChanged += new EventHandler(this.textboxPerson_TxtChanged);

    Label labelToChange = new Label();
    labelToChange.Name = "label"+i;
    labelToChange.Text = "";

    flowlayoutPanel.Controls.Add(textboxPerson);
    flowlayoutPanel.Controls.Add(labelToChange);
}

Обработчик событий:

private void textboxPerson_TextChanged(object sender, EventArgs e)
{
   //So far, I'm only getting the number of the Textbox that changed.
}

Вот, где мне нужен ваш совет. Текстовые поля и метки совпадают (т.е. вы видите, что Texbox1 подключен к метке 1). Но как мне обратиться к одному элементу управления в частности?

  • Если текст Texbox1 изменяется, как мне обратиться к Label1, чтобы изменить его текст или что-то еще?
  • Существуют ли современные технологии добавления динамических элементов графического интерфейса в форму и обработки их?

Ответы [ 4 ]

3 голосов
/ 15 июля 2009

Например, вы можете использовать свойство Tag элементов управления. В вашем цикле вы можете присвоить Label свойству Tag TextBox следующим образом:

TextBox textboxPerson = new TextBox();
// do the stuff with the text box

Label labelToChange = new Label();
// do the stuff with the label
textboxPerson.Tag = labelToChange

Затем вы можете добраться до Label в TextChanged событии TextBox:

private void textboxPerson_TextChanged(object sender, EventArgs e)
{
   //So far, I'm only getting the number of the Textbox that changed.
   Label theLabel = (sender as TextBox).Tag;
   theLabel.Text = "whatever should go here";
}
2 голосов
/ 15 июля 2009

В вашем конкретном случае вы можете использовать привязку данных, чтобы связать Label с TextBox:

for (int i = 0; i < reports.Count; i++) {
  TextBox textboxPerson = new TextBox();
  textboxPerson.Name = "TextboxName" + i;
  textboxPerson.Text = reports[i].Name;
  //textboxPerson.TextChanged += new EventHandler(this.textboxPerson_TxtChanged);

  Label labelToChange = new Label();
  labelToChange.Name = "label" + i;
  labelToChange.Text = "";

  // this will update labelToChange.Text whenever textboxPerson.Text changes
  labelToChange.DataBindings.Add("Text", textboxPerson, "Text");

  flowlayoutPanel.Controls.Add(textboxPerson);
  flowlayoutPanel.Controls.Add(labelToChange);
}

Если вы используете это, вам даже не нужно обрабатывать событие TextChanged

2 голосов
/ 15 июля 2009

Можно подумать о написании собственного маленького UserControl, который группирует TextBox и Label. Это особенно полезно, если ваш сгенерированный набор элементов управления становится больше (например, вы добавляете одну или две кнопки).

С наилучшими пожеланиями

0 голосов
/ 15 июля 2009

Сделайте так в вашем обработчике событий:

string labelName = ((Control)sender).Name.Replace("TextboxName","label");
Label [] labels = FlowlayoutPanel.Controls.Find(labelName,false);
if (labels.Length > 0)
    labels[0].Text = "This is your attached label";
...