【问题标题】:Add/Remove panel controls by clicking button on dynamically added usercontrol通过单击动态添加的用户控件上的按钮来添加/删除面板控件
【发布时间】:2015-12-04 18:13:36
【问题描述】:

我是 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 用户控件而不是 Welcome.cs 用户控件。

我希望能够在 UserControl.cs 上的按钮单击处理程序中使用:

mainPanel.Controls.Clear();
UserControl usrCtl = new UserControl();
Form1.mainPanel.Controls.Add(usrCtl);

我的问题似乎是 WelcomeMenu.cs 无法看到或访问 Form1 主面板。

有没有办法让它工作?还是我试图以错误的方式做到这一点?

我使用这种方法的原因是我可以为每个部门加载一个新的 buttonPanel.cs 用户控件和 mainPanel.cs 用户控件,然后能够更改我在当前 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 个面板。菜单面板和主面板。它们都设置为 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");
    }
}

}

这是我的用户控件:

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

}

【问题讨论】:

  • UserControl 有一个名为ParentForm 的属性。尝试用它代替Form1,这是一个不恰当的引用。将其转换为 Form1。虽然不是最好的设置。您的 UserControl 真的应该只引发一个事件并让表单处理这项业务。此外,Clearing 控件不会处理它们。完成后你必须处理它们。
  • @LarsTech 是正确的。我错过了那部分。但是,mainPanel 仍然需要设置为 Public,因为它是 Modifier,以便其他 UserControls 能够引用它。
  • 这听起来像我需要的。不知道如何表达我的搜索问题。你能告诉我我应该搜索什么来找到一些如何让事件处理此类问题的示例吗?
  • 另外,我尝试用 ParentForm 替换 Form1,现在我在 mainPanel 上收到错误消息:“'Form' 不包含 'mainPanel' 的定义并且没有扩展方法 'mainPanel' 接受第一个可以找到 'Form' 类型的参数(您是否缺少 using 指令或程序集引用?)"

标签: c# winforms user-controls


【解决方案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);
    }

Form1 上的按钮 1 单击处理程序:

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

【讨论】:

    【解决方案2】:

    将 mainPanel 的 accessibility Modifiers 属性从 private 设置为 internal public。

    【讨论】:

    • 我为我的密集道歉。我找不到任何与可访问性应用程序无关的称为可访问性的属性。我确实在 Design 下找到了一个名为 Modifiers 的属性,该属性目前被列为 Private。我把它改成内部了,还是不行。
    • 好的。我将修饰符更改为公共,当我尝试添加控件时出现上面列出的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多