2

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

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

button_click

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

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

4

5 回答 5

3

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

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

希望能帮助到你。

于 2013-01-22T07:17:13.557 回答
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 可能是您的答案。

于 2013-01-22T07:17:16.583 回答
0

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

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

于 2013-01-22T07:18:47.360 回答
0

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

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 循环中为控件添加的任何属性。

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

希望能帮助到你。

于 2013-01-22T09:27:24.493 回答
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 所说,听起来用户控件在这种情况下很有用,因为它有助于封装您所追求的功能。但是,这可能需要一些时间来了解您的想法,您可能会发现现在在表单中执行所有操作而不创建新控件更简单。

于 2013-01-22T07:33:03.427 回答