繁体   English   中英

通过单击动态添加的用户控件上的按钮来添加/删除面板控件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM