C#表单元素的动态命名

时间:2013-01-22 07:04:32

标签: c# winforms

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

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

button_click

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

从这里,我无法定位任何儿童控制。我习惯于在jQuery中进行定位和处理,所以我甚至不知道如何解释自己的正确的C#术语。

5 个答案:

答案 0 :(得分:3)

如果您能正确理解问题,我建议您使用Usercontrol制作Panel并填写LabelButton等等。在usercontrol中为按钮写下事件。然后在表单中引入此usercontrol,它应该工作。您可以在表单中引入任意数量的用户控件,并且每个按钮仅对该用户控件中的标签起作用/工作。

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

希望它有所帮助。

答案 1 :(得分:1)

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

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

但是,如果button1直接放在您的表单上并且button1.Name属性设置为“button1”(设计器自动执行此操作,如果您动态创建控件,则必须注意命名控件)自己。)

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

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可能是你的答案。

答案 2 :(得分:0)

我会为此创建一个用户控件(UserControl)。 有关difference between Control and UserControl

的更多说明,请查看此文章

控件和UserControl很容易复制,并且有完整的功能。

答案 3 :(得分:0)

您可以像在任何其他对象中一样在代码中创建新的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所说,听起来用户控件在这种情况下会很有用,因为它有助于封装你所追求的功能。然而,这可能需要一些时间才能完成,你可能会发现现在更简单,无需创建新控件即可完成表格中的所有操作。

答案 4 :(得分:0)

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

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循环中设置要添加的任何属性。

这只是我之前回答的替代方案。我仍然建议我先前给出的答案。此代码是虚拟的,未经过测试。

希望它有所帮助。