我正在c#windows窗体应用程序上测试此代码。这是我正在做的测试。
Panel1有一个“p1Button”。 “UserControl1”有一个“uc1Button”点击“p1Button”在Panel1中加载“UserControl1” 当我在“uc1Button”上点击事件时,我无法找到panel2
是可能还是有任何建议?
// Form1.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();
}
}
}
首先,您不应将控件设置为单例。其次,你必须要注意亲子关系。
你的父母是Form。表格有两个孩子 - 面板。 Panel 1有另外两个孩子 - 你的用户控件和一个按钮。您的usercontrol还有其他子项 - 按钮。
因此,如果您想在usercontrol1的第二个面板上添加一些内容,则至少有两个选项:
然后在按钮中单击用户控件:
ButtonClicked?.Invoke(this, EventArgs.Empty);
然后,您需要将主表单注册到此处理程序:
UserControl1.ButtonClicked += (s, e) =>
{
//show usercontrol2 on your panel.
}
您应该阅读有关C#中的委托和事件的更多信息。