C# 从 UserControl 打开 UserControl
C# open UserControl from UserControl
我正在尝试让 SplitPanel
左侧的 UserControl
在右侧打开一个新的用户控件。上面的按钮在左侧打开一个UserControl
;但是,我无法让左侧的按钮在 SplitPanel
的右侧打开一个新的 UserControl
。感谢我能得到的任何帮助。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region Buttons
private void button1_Click(object sender, EventArgs e)
{
if (!splitContainer1.Panel1.Controls.Contains(left_Settings.Instance))
{
splitContainer1.Panel1.Controls.Add(left_Settings.Instance);
left_Settings.Instance.Dock = DockStyle.Fill;
left_Settings.Instance.BringToFront();
}
else
{
left_Settings.Instance.BringToFront();
}
}
-
public partial class left_Settings : UserControl
{
private static left_Settings _instance;
public static left_Settings Instance
{
get
{
if (_instance == null)
{
_instance = new left_Settings();
}
return _instance;
}
}
public left_Settings()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (!splitContainer1.Panel2.Controls.Contains(right_settings_start.Instance))
{
splitContainer1.Panel2.Controls.Add(right_settings_start.Instance);
right_settings_start.Instance.Dock = DockStyle.Fill;
right_settings_start.Instance.BringToFront();
}
else
{
right_settings_start.Instance.BringToFront();
}
}
private void button2_Click(object sender, EventArgs e)
{
//Some code
}
}
-
public partial class right_settings_start : UserControl
{
private static right_settings_start _instance;
public static right_settings_start Instance
{
get
{
if (_instance == null)
{
_instance = new right_settings_start();
}
return _instance;
}
}
public right_settings_start()
{
InitializeComponent();
}
}
我的代码做了类似的事情,但使用面板并直接实例化控件而不是使用内部 "instance" 属性.
Control myControl = new Control();
//Do initialization stuff
RightPanel.Controls.Add(myControl);
//Do Docking and Layout stuff
myControl.Show();
据我所知,您唯一缺少的是 Control.Show()
命令。确保您的控件确实已加载,这不仅仅是添加它并将其放在前面,您必须告诉代码显示它。在 Control_Load
事件中设置断点可以让您确保它实际出现。
更新
这可能不起作用的另一个原因是 SplitContainer 本身作为一个对象存在于表单中,但您正试图从 left_settings 对象内部访问它...看不到它.尝试将其引用为 this.ParentForm.splitContainer1
并查看它是否可以找到它。如果 left_settings 看不到它,您可能需要将其设为 public 对象,或者为其提供一些其他访问器。
我正在尝试让 SplitPanel
左侧的 UserControl
在右侧打开一个新的用户控件。上面的按钮在左侧打开一个UserControl
;但是,我无法让左侧的按钮在 SplitPanel
的右侧打开一个新的 UserControl
。感谢我能得到的任何帮助。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region Buttons
private void button1_Click(object sender, EventArgs e)
{
if (!splitContainer1.Panel1.Controls.Contains(left_Settings.Instance))
{
splitContainer1.Panel1.Controls.Add(left_Settings.Instance);
left_Settings.Instance.Dock = DockStyle.Fill;
left_Settings.Instance.BringToFront();
}
else
{
left_Settings.Instance.BringToFront();
}
}
-
public partial class left_Settings : UserControl
{
private static left_Settings _instance;
public static left_Settings Instance
{
get
{
if (_instance == null)
{
_instance = new left_Settings();
}
return _instance;
}
}
public left_Settings()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (!splitContainer1.Panel2.Controls.Contains(right_settings_start.Instance))
{
splitContainer1.Panel2.Controls.Add(right_settings_start.Instance);
right_settings_start.Instance.Dock = DockStyle.Fill;
right_settings_start.Instance.BringToFront();
}
else
{
right_settings_start.Instance.BringToFront();
}
}
private void button2_Click(object sender, EventArgs e)
{
//Some code
}
}
-
public partial class right_settings_start : UserControl
{
private static right_settings_start _instance;
public static right_settings_start Instance
{
get
{
if (_instance == null)
{
_instance = new right_settings_start();
}
return _instance;
}
}
public right_settings_start()
{
InitializeComponent();
}
}
我的代码做了类似的事情,但使用面板并直接实例化控件而不是使用内部 "instance" 属性.
Control myControl = new Control();
//Do initialization stuff
RightPanel.Controls.Add(myControl);
//Do Docking and Layout stuff
myControl.Show();
据我所知,您唯一缺少的是 Control.Show()
命令。确保您的控件确实已加载,这不仅仅是添加它并将其放在前面,您必须告诉代码显示它。在 Control_Load
事件中设置断点可以让您确保它实际出现。
更新
这可能不起作用的另一个原因是 SplitContainer 本身作为一个对象存在于表单中,但您正试图从 left_settings 对象内部访问它...看不到它.尝试将其引用为 this.ParentForm.splitContainer1
并查看它是否可以找到它。如果 left_settings 看不到它,您可能需要将其设为 public 对象,或者为其提供一些其他访问器。