通过单击动态添加的usercontrol

时间:2015-12-04 18:13:36

标签: c# winforms user-controls

我是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);
    }
}

}

2 个答案:

答案 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。