关于winforms:C#表单元素的动态命名

Dynamic Naming of C# Form Elements

我的应用需要能够动态创建新的表单元素并使用它们。现在我有一个面板,里面有按钮和标签。我需要能够复制它并在我的应用程序中显示它,然后使用它。

例如,我有 panel1。里面是 label1、button1 和 button2。
标签 1 只是按秒计数。
当您单击 button1 时,label1 开始计数。当您单击按钮 2 时,计时器停止。
我的问题是我需要能够多次复制 panel1 并且仍然让新按钮与正确的标签相对应。

开启button_click

1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
{
   Button theSender = (Button)sender;
   Panel parentPanel = (Panel)theSender.Parent;
}

从这里开始,我无法定位任何子控件。我习惯于在 jQuery 中定位和处理,所以我什至不知道如何解释自己的正确 C# 术语。


如果正确理解你的问题,我建议你用 Panel 制作一个 Usercontrol 并用你的 LabelButton 等填充它。在用户控件中为您的按钮编写事件。然后在您的表单中引入此用户控件,它应该可以工作。您可以在表单中引入任意数量的用户控件,每个按钮将只针对该用户控件中的标签运行/工作。

正如您所说,您是 winforms 的新手,您不确定我在说什么,请告诉我,如果我有足够的时间,我会提供帮助。

希望对你有帮助。


可以使用 Control.Contrtols 集合访问控件的子项,例如访问表单上的按钮:

1
Button btn = this.Controls["button1"];

但这只有在 button1 直接放置在您的表单上并且 button1.Name 属性设置为"button1"时才是正确的(设计者会自动执行此操作,如果您正在动态创建控件,则必须注意命名控件你自己。)

您还可以枚举任何控件的子控件,例如panel1 的子控件:

1
2
3
4
5
6
7
8
9
foreach(Control c in panel1.Controls)
{
// do something, e.g.
   if(c is Label){//do sth...}
   if(c.Name.Equals("label1") && c is Label)
   {
      Label l = c as Label;
   }
}

正如@rapsalands 所说,UserControl 可能是你的答案。


所以你是一个初学者,需要一些时间来理解Usercontrol,正如我在之前的回答中提到的那样。在表单的 ConstructorLoad 事件中使用 for 循环来动态生成控件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Panel panel;
Label label;
Button button1;
Button button2;

for(int i = 0; i > count; i++)
{
    panel = new Panel();
    button1 = new Button();
    button2 = new Button();
    label = new Label();

    panel.Controls.Add(button1);
    panel.Controls.Add(button2);
    panel.Controls.Add(label);
    Controls.Add(panel);

    button1.Click += Event1;
    button2.Click += Event2;
}

private void Event1()
{
    label.Text ="Button 1 Clicked."
}
private void Event2()
{
    label.Text ="Button 2 Clicked."
}

通过这种方式,您当然可以创建任意数量的控件,并且也可以达到您的目的。使用一些变量来适当地定位面板控件。为控件设置您希望在 for 循环中添加的任何属性。

这只是我之前答案的替代方案。我仍然推荐我之前给出的答案。此代码是虚拟的,未经测试。

希望对你有帮助。


您可以像创建任何其他对象一样在代码中创建新的 UI 控件:Button b = new Button();

然后您可以使用 form.Controls.Add(b) 将它们添加到表单中。您还需要定位和调整控件的大小(有可用的属性)并使用 b.Clicked += form.button_click;.

连接您的事件处理程序

要查看这方面的示例,您可以尝试查看在 Visual Studio 中生成的 Designer.cs 文件(不要对其进行更改,只需查看一下即可)。一开始它看起来很复杂,但可能有助于揭开 Windows 窗体的神秘面纱,并且您将能够找到您需要在其中设置的所有属性。

每当您在设计器中更新某些内容时,Visual Studio 都会生成新代码并将其放入 Designer.cs 文件中。整个表单在 InitializeComponent() 方法中设置,该方法从表单的构造函数中调用。您应该能够复制其中的一些代码并进行一些修改,然后使用它来创建您自己的动态 UI 元素。

正如 rapsalands 所说,听起来用户控件在这种情况下很有用,因为它有助于封装您所追求的功能。但是,这可能需要一些时间来理解,并且您可能会发现现在在不创建新控件的情况下执行表单中的所有操作更简单。


我会为此创建一个用户控件 (UserControl)。
查看这篇文章以获取有关 Control 和 UserControl 之间区别的更多说明。

控件和用户控件很容易复制,并且功能齐全。