【发布时间】: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