c#\无法从另一个用户控件按钮加载用户控件

问题描述 投票:1回答:1

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

enter image description here

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();
        }
    }
}
c# windows-forms-designer
1个回答
0
投票

首先,您不应将控件设置为单例。其次,你必须要注意亲子关系。

你的父母是Form。表格有两个孩子 - 面板。 Panel 1有另外两个孩子 - 你的用户控件和一个按钮。您的usercontrol还有其他子项 - 按钮。

因此,如果您想在usercontrol1的第二个面板上添加一些内容,则至少有两个选项:

  1. 糟糕的方式。这是不好的方法,你不应该这样做,因为它严格绑定并将你的用户控件与你的表单结合起来。您应该从您的用户控件(面板)获取父级,然后从此面板(这是表单)获取父级,然后查看另一个面板。
  2. 好方法。简单又好。将事件处理程序添加到usercontrol,例如: public UserControl1:UserControl {public event EventHandler ButtonClicked; }

然后在按钮中单击用户控件:

ButtonClicked?.Invoke(this, EventArgs.Empty);

然后,您需要将主表单注册到此处理程序:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.