c#\无法从其他用户控件按钮加载用户控件

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

我正在一个c#windows窗体应用程序上测试这段代码。这是我正在做的测试

Panel1有一个“p1按钮”。 “UserControl1”有一个“UC1按钮” 单击“p1Button”以加载Panel1中的“UserControl1”
单击“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上,您至少有两个选项:

  • 坏方法。 这是一种糟糕的方式,您不应该这样做,因为它会将您的用户控件与表单严格绑定和耦合。 您应该从用户控件(即面板)获取父对象,然后从该面板(即窗体)获取父对象,然后查看另一个面板

  • 好办法。 简单又好。将事件处理程序添加到usercontrol,例如:

    公共UserControl1:UserControl { 单击公共事件事件处理程序按钮; }

  • 然后在按钮中单击userControl:

    ButtonClicked?.Invoke(this, EventArgs.Empty);
    
    然后,您需要将主表单注册到此处理程序:

    UserControl1.ButtonClicked += (s, e) =>
    {
        //show usercontrol2 on your panel.
    }
    

    您应该阅读更多关于C#中的委托和事件的信息。

    首先,您不应该将控件设置为单例。 第二,你必须意识到父子之间的界限

    你的父母很健康。表单有两个孩子-面板。面板1还有另外两个孩子-你的用户控件和一个按钮。您的usercontrol还有其他子项-按钮

    因此,如果您想将usercontrol1中的内容放在面板2上,您至少有两个选项:

  • 坏方法。 这是一种糟糕的方式,您不应该这样做,因为它会将您的用户控件与表单严格绑定和耦合。 您应该从用户控件(即面板)获取父对象,然后从该面板(即窗体)获取父对象,然后查看另一个面板

  • 好办法。 简单又好。将事件处理程序添加到usercontrol,例如:

    公共UserControl1:UserControl { 单击公共事件事件处理程序按钮; }

  • 然后在按钮中单击userControl:

    ButtonClicked?.Invoke(this, EventArgs.Empty);
    
    然后,您需要将主表单注册到此处理程序:

    UserControl1.ButtonClicked += (s, e) =>
    {
        //show usercontrol2 on your panel.
    }
    

    您应该阅读更多关于C#中的委托和事件的信息。

    您的用户控件是单例的,为什么?您需要了解事件、委托和事件处理程序……正如其他人已经提到的,将它们设置为单例是没有用的,我建议您阅读控件的生命周期,并进行一些深入了解。Initialize方法是通过构造函数调用的,所以现在若您有单例,那个么将调用一次ctor。因此不会出现布局。你应该问的下一个问题是布局代码在哪里,答案是在类声明“部分类”中阅读所有这些你的用户控件是单例的,为什么?您需要了解事件、委托和事件处理程序……正如其他人已经提到的,将它们设置为单例是没有用的,我建议您阅读控件的生命周期,并进行一些深入了解。Initialize方法是通过构造函数调用的,所以现在若您有单例,那个么将调用一次ctor。因此不会出现布局。您应该问的下一个问题是布局代码在哪里,答案是在类声明“部分类”中阅读所有这些内容