[英]Add/Remove panel controls by clicking button on dynamically added usercontrol
我是C#Windows窗体的新手,我正在尝试制作一个具有两个面板的GUI。 左侧面板用于显示包含按钮的动态添加的用户控件。 右侧面板用于显示动态添加的用户控件,其中包含其他控件:文本框,标签,组合框,按钮等。
我创建了一个具有两个面板的form1。 通过使用添加到表单顶部的菜单,我可以成功加载具有不同UserControl.cs内容的两个面板。 当我单击菜单选项时,向form1 buttonPanel加载适当的buttonPanel.cs内容,向form1 mainPanel加载适当的mainPanel.cs内容。 但是,当我单击buttonPanel.cs上存在的按钮时,无法获得form1 mainPanel来更改其内容。
即:WelcomeMenu.cs有一个名为btnPage2的按钮,该按钮应更改mainPanel控件以显示Page2.cs用户控件,而不是Welcome.cs用户控件。
我希望能够在UserControl.cs的按钮单击处理程序中使用:
mainPanel.Controls.Clear();
UserControl usrCtl = new UserControl();
Form1.mainPanel.Controls.Add(usrCtl);
我的问题似乎是WelcomeMenu.cs无法查看或访问Form1 mainPanel。
有没有办法使这项工作? 还是我尝试以错误的方式执行此操作?
我采用这种方法的原因是,我可以为每个部门加载新的buttonPanel.cs usercontrol和mainPanel.cs usercontrol,然后能够更改在当前buttonPanel中单击的每个按钮的mainPanel内容。 我试图避免在Form1上创建一堆面板,然后隐藏它们,只在需要它们时才显示它们。
更新:buttonMenu.cs
{
{
public partial class ucWelcomeMenu : UserControl
public ucWelcomeMenu()
{
InitializeComponent();
}
private void btnPage2_Click(object sender, EventArgs e)
{
Form1.mainPanel.Controls.Clear();
ucWelcome frm = new ucWelcome();
Form1.mainPanel.Controls.Add(frm);
}
}
}
Form1.mainPanel.Controls.Add(frm)在Form1.mainPanel上生成错误,指出:“非静态字段,方法或属性'Form1.mainPanel'需要对象引用。
更新2:
好。 我搜索了几个不同的链接,并找到了一些有用的信息。 但是,我仍然无法通过动态添加的UserControl.cs中的按钮单击来触发事件。 我在Form1上有2个面板。 menuPanel和mainPanel。 它们都设置为Modifiers = Public。
这是我的Form1:
namespace TestUserControl
public partial class Form1 : Form
{
private ucWelcomeMenu welc = new ucWelcomeMenu();
public Form1()
{
InitializeComponent();
ucWelcomeMenu welcomeMenu = new ucWelcomeMenu();
menuPanel.Controls.Add(welcomeMenu);
welc.ButtonClick += new EventHandler(this.CustomEvent_Handler);
}
private void CustomEvent_Handler(object sender, EventArgs e)
{
MessageBox.Show("Yes");
}
}
}
这是我的UserControl:
namespace TestUserControl.UserControls
public partial class ucWelcomeMenu : UserControl
{
public event EventHandler ButtonClick;
public ucWelcomeMenu()
{
InitializeComponent();
}
private void btnPage2_Click(object sender, EventArgs e)
{
if (ButtonClick != null)
ButtonClick(sender, e);
}
}
}
好。 我肯定有点慢。 我发现了问题。 我两次实例化了ucWelcomeMenu。 一旦删除了构造函数上方的私有实例,事件就可以正常触发了。 感谢所有的投入。 它使我获得了一些很好的链接,其中包含一些非常有用的信息。
我最终得到的是:
Form1菜单选项单击处理程序:
private void option1ToolStripMenuItem_Click(object sender, EventArgs e)
{
UserControl1 ctl1 = new UserControl1();
menuPanel.Controls.Add(ctl1);
ctl1.btn1Click += new EventHandler(btn1_Click);
UserControl2 ctl2 = new UserControl2();
mainPanel.Controls.Add(ctl2);
}
按钮1单击Form1上的Handler:
private void btn1_Click(object sender, EventArgs e)
{
mainPanel.Controls.Clear();
UserControl2 frm = new UserControl2();
mainPanel.Controls.Add(frm);
}
UserControl1.cs
public partial class UserControl1 : UserControl
{
public event EventHandler btn1Click;
public UserControl1()
{
InitializeComponent();
}
private void btn1_Click(object sender, EventArgs e)
{
if (btn1Click!= null)
btn1Click(sender, e);
}
}
将mainPanel的
可访问性
Modifiers属性设置为private到
内部
public。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.