我是c#windows表单的新手,我试图制作一个有两个面板的GUI。左侧面板用于显示包含按钮的动态添加的用户控件。右侧面板用于显示动态添加的包含其他控件的用户控件:文本框,标签,组合框,按钮等。
我创建了一个包含两个面板的form1。我可以使用我已添加到表单顶部的菜单成功加载具有不同UserControl.cs内容的两个面板。当我单击一个菜单选项时,form1 buttonPanel加载了相应的buttonPanel.cs内容,并且form1 mainPanel加载了相应的mainPanel.cs内容。但是,当我单击buttonPanel.cs上存在的按钮时,我无法获得form1 mainPanel来更改它的内容。
ie:WelcomeMenu.cs有一个名为btnPage2的按钮,它应该更改mainPanel控件以显示Page2.cs usercontrol而不是Welcome.cs usercontrol。
我希望能够在UserControl.cs上的按钮点击处理程序中使用:
mainPanel.Controls.Clear();
UserControl usrCtl = new UserControl();
Form1.mainPanel.Controls.Add(usrCtl);
我的问题似乎是WelcomeMenu.cs无法查看或访问Form1主面板。
有没有办法让这项工作?或者我试图以错误的方式做到这一点?
我这个方法的原因是我可以为每个部门加载一个新的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);
}
}
}
答案 0 :(得分:1)
确定。我肯定有点慢。我发现了我的问题。我两次实例化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上的处理程序:
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);
}
}
答案 1 :(得分:0)
将mainPanel的辅助功能修饰符属性从private设置为 internal public。