2

我遇到了一个问题,可能经常看到,但这里从未真正讨论过。

在我的 Gui 中,我将 for 循环中的控件添加到 Flowpanellayout。重点是显示来自数据库的“报告”。它必须是动态的,因为每天的报告数量可能不同。


伪代码添加 Gui 元素:

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 与 Label1 相连)。但是,我如何特别解决一个控件?

  • 如果 Texbox1 的 Text 发生变化,我如何解决 Label1 以更改其 Text 或其他内容?
  • 是否有向表单添加动态 Gui 元素并处理它们的最新技术?
4

4 回答 4

3

例如,您可以使用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";
}
于 2009-07-15T07:42:56.063 回答
2

您可以考虑编写自己的小用户控件,它将文本框和标签分组。如果您生成的控件集变得更大(例如,您要添加一个或两个按钮),这将特别有用。

最好的祝福

于 2009-07-15T07:44:48.773 回答
2

在您的特定情况下,您可以使用数据绑定将 链接LabelTextBox

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事件

于 2009-07-15T07:50:45.830 回答
0

在您的事件处理程序中这样做:

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";
于 2009-07-15T08:00:41.893 回答