c#\无法从其他用户控件按钮加载用户控件
我正在一个c#windows窗体应用程序上测试这段代码。这是我正在做的测试 Panel1有一个“p1按钮”。 “UserControl1”有一个“UC1按钮” 单击“p1Button”以加载Panel1中的“UserControl1”c#\无法从其他用户控件按钮加载用户控件,c#,windows-forms-designer,C#,Windows Forms Designer,我正在一个c#windows窗体应用程序上测试这段代码。这是我正在做的测试 Panel1有一个“p1按钮”。 “UserControl1”有一个“UC1按钮” 单击“p1Button”以加载Panel1中的“UserControl1” 单击“UC1按钮”上的事件时,我找不到panel2 有没有可能或者有什么建议 //表格1.cs using System; using System.Windows.Forms; namespace Test { public partial clas
单击“UC1按钮”上的事件时,我找不到panel2 有没有可能或者有什么建议 //表格1.cs
using System;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void p1Button_Click(object sender, EventArgs e)
{
if (!panel1.Controls.Contains(UserControl1.Instance))
{
panel1.Controls.Add(UserControl1.Instance);
UserControl1.Instance.BringToFront();
}
else
{
UserControl1.Instance.BringToFront();
}
}
}
}
//UserControl1.cs
using System;
using System.Windows.Forms;
namespace Test
{
public partial class UserControl1 : UserControl
{
private static UserControl1 _instance;
public static UserControl1 Instance
{
get
{
if (_instance==null)
{
_instance = new UserControl1();
}
return _instance;
}
}
public UserControl1()
{
InitializeComponent();
}
private void uc1Button_Click(object sender, EventArgs e)
{
}
}
}
//UserControl2.cs
using System.Windows.Forms;
namespace Test
{
public partial class UserControl2 : UserControl
{
private static UserControl2 _instance;
public static UserControl2 Instance
{
get
{
if (_instance == null)
{
_instance = new UserControl2();
}
return _instance;
}
}
public UserControl2()
{
InitializeComponent();
}
}
}
首先,您不应该将控件设置为单例。 第二,你必须意识到父子之间的界限 你的父母很健康。表单有两个孩子-面板。面板1还有另外两个孩子-你的用户控件和一个按钮。您的usercontrol还有其他子项-按钮 因此,如果您想将usercontrol1中的内容放在面板2上,您至少有两个选项:
ButtonClicked?.Invoke(this, EventArgs.Empty);
然后,您需要将主表单注册到此处理程序:
UserControl1.ButtonClicked += (s, e) =>
{
//show usercontrol2 on your panel.
}
您应该阅读更多关于C#中的委托和事件的信息。首先,您不应该将控件设置为单例。 第二,你必须意识到父子之间的界限 你的父母很健康。表单有两个孩子-面板。面板1还有另外两个孩子-你的用户控件和一个按钮。您的usercontrol还有其他子项-按钮 因此,如果您想将usercontrol1中的内容放在面板2上,您至少有两个选项:
ButtonClicked?.Invoke(this, EventArgs.Empty);
然后,您需要将主表单注册到此处理程序:
UserControl1.ButtonClicked += (s, e) =>
{
//show usercontrol2 on your panel.
}
您应该阅读更多关于C#中的委托和事件的信息。您的用户控件是单例的,为什么?您需要了解事件、委托和事件处理程序……正如其他人已经提到的,将它们设置为单例是没有用的,我建议您阅读控件的生命周期,并进行一些深入了解。Initialize方法是通过构造函数调用的,所以现在若您有单例,那个么将调用一次ctor。因此不会出现布局。你应该问的下一个问题是布局代码在哪里,答案是在类声明“部分类”中阅读所有这些你的用户控件是单例的,为什么?您需要了解事件、委托和事件处理程序……正如其他人已经提到的,将它们设置为单例是没有用的,我建议您阅读控件的生命周期,并进行一些深入了解。Initialize方法是通过构造函数调用的,所以现在若您有单例,那个么将调用一次ctor。因此不会出现布局。您应该问的下一个问题是布局代码在哪里,答案是在类声明“部分类”中阅读所有这些内容