Dynamic Naming of C# Form Elements
我的应用需要能够动态创建新的表单元素并使用它们。现在我有一个面板,里面有按钮和标签。我需要能够复制它并在我的应用程序中显示它,然后使用它。
例如,我有 panel1。里面是 label1、button1 和 button2。
标签 1 只是按秒计数。
当您单击 button1 时,label1 开始计数。当您单击按钮 2 时,计时器停止。
我的问题是我需要能够多次复制 panel1 并且仍然让新按钮与正确的标签相对应。
开启
1 2 3 4 5 | private void button1_Click(object sender, EventArgs e) { Button theSender = (Button)sender; Panel parentPanel = (Panel)theSender.Parent; } |
从这里开始,我无法定位任何子控件。我习惯于在 jQuery 中定位和处理,所以我什至不知道如何解释自己的正确 C# 术语。
如果正确理解你的问题,我建议你用
正如您所说,您是 winforms 的新手,您不确定我在说什么,请告诉我,如果我有足够的时间,我会提供帮助。
希望对你有帮助。
可以使用 Control.Contrtols 集合访问控件的子项,例如访问表单上的按钮:
1 | Button btn = this.Controls["button1"]; |
但这只有在 button1 直接放置在您的表单上并且 button1.Name 属性设置为"button1"时才是正确的(设计者会自动执行此操作,如果您正在动态创建控件,则必须注意命名控件你自己。)
您还可以枚举任何控件的子控件,例如panel1 的子控件:
1 2 3 4 5 6 7 8 9 |
正如@rapsalands 所说,UserControl 可能是你的答案。
所以你是一个初学者,需要一些时间来理解
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 控件:
然后您可以使用
连接您的事件处理程序
要查看这方面的示例,您可以尝试查看在 Visual Studio 中生成的 Designer.cs 文件(不要对其进行更改,只需查看一下即可)。一开始它看起来很复杂,但可能有助于揭开 Windows 窗体的神秘面纱,并且您将能够找到您需要在其中设置的所有属性。
每当您在设计器中更新某些内容时,Visual Studio 都会生成新代码并将其放入 Designer.cs 文件中。整个表单在
正如 rapsalands 所说,听起来用户控件在这种情况下很有用,因为它有助于封装您所追求的功能。但是,这可能需要一些时间来理解,并且您可能会发现现在在不创建新控件的情况下执行表单中的所有操作更简单。
我会为此创建一个用户控件 (UserControl)。
查看这篇文章以获取有关 Control 和 UserControl 之间区别的更多说明。
控件和用户控件很容易复制,并且功能齐全。