我的应用程序需要能够动态创建新的表单元素并使用它们。现在我有一个带按钮和标签的面板。我需要能够复制这个并在我的应用程序中显示它,然后使用它。
例如,我有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#术语。
答案 0 :(得分:3)
如果您能正确理解问题,我建议您使用Usercontrol
制作Panel
并填写Label
,Button
等等。在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
。在表单的Constructor
或Load
事件中使用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循环中设置要添加的任何属性。
这只是我之前回答的替代方案。我仍然建议我先前给出的答案。此代码是虚拟的,未经过测试。
希望它有所帮助。