c# - 在用户控件单击事件中切换主窗体中的用户控件

标签 c# .net winforms instance

这听起来可能很愚蠢,但我很难弄明白;任何帮助将不胜感激:

我有两个名为“Safety_Check”和“OEE_Track”的用户控件。在我的 MainForm 中,我有一个名为“pnl_main_controller”的面板,这是我显示两个用户控件的地方。我的主窗体上有两个按钮,我可以在两者之间动态切换,没有任何问题。

Safety_Check 用户控制;

public partial class Safety_Check : UserControl
    {
        private static Safety_Check _instance;

        public static Safety_Check instance
        {
            get
            {
                if (_instance == null)
                    _instance = new Safety_Check();
                return _instance;
            }
        }

        public Safety_Check()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ///////------------------------
        }

    }

OEE_Track 用户控制

public partial class OEE_Track : UserControl
    {

        private static OEE_Track _instance;

        public static OEE_Track instance
        {
            get
            {
                if (_instance == null)
                    _instance = new OEE_Track();
                return _instance;
            }
        }

        public OEE_Track()
        {
            InitializeComponent();
        }
    }

主窗体:

public partial class MainForm : Form
    {
     private void btn_reg_Click(object sender, EventArgs e)
        {
            if (!pnl_main_controller.Contains(Safety_Check.instance))
            {
                pnl_main_controller.Controls.Add(Safety_Check.instance);
                Safety_Check.instance.Dock = DockStyle.Fill;
                Safety_Check.instance.BringToFront();
            }
            else
            {
                Safety_Check.instance.BringToFront();
            }        }

       private void btn_OEE_Click(object sender, EventArgs e)
        {
            if (!pnl_main_controller.Contains(OEE_Track.instance))
            {
                pnl_main_controller.Controls.Add(OEE_Track.instance);
                OEE_Track.instance.Dock = DockStyle.Fill;
                OEE_Track.instance.BringToFront();
            }
            else
            {
                OEE_Track.instance.BringToFront();
            }
     }

我想做的是在我的“Safety_Check”上有一个名为“Button1”的按钮” Usercontrol,每当我按下这个按钮时,我希望“Safety_Check”在“pnl_main_controller”上消失并带来“OEE_Track”到面板

最佳答案

控件之间的交互有多种解决方案。控件是类,并且像任何其他类一样,它们可以使用它们的公共(public)属性和方法或使用一些中介相互交互。

在这种情况下,您的控件不需要相互了解,也不需要直接相互交互:

  • 他们可以要求另一个知道这两个控件的对象为他们完成这项工作。
  • 或者他们可以提出他们的请求通知,订阅该通知的人将提供该通知。

要让另一个对象为他们完成工作,您有多种解决方案。例如,您可以在父窗体和子控件中实现特定接口(interface),将父控件转换为该特定接口(interface)并调用为您完成工作的特定方法。

为了提高请求通知,一个简单的解决方案是依赖于事件。您可以在子控件中创建一个事件,并在需要父控件为您做某事时引发它。然后在父级订阅该事件并完成工作。

示例 - 使用事件

我假设您有 UserControl1,其中包含 Button1,并且您已经处理了 Button1Click 事件。然后你可以创建 Button1Clicked 事件并在 Button1 单击时引发它:

public event EventHandler Button1Clicked;
private void Button1_Click(object sender, EventArgs e)
{
    Button1Clicked?.Invoke(this, e);
}

然后在父表单中,订阅事件并做任何你想做的事情:

private void userControl11_Button1Clicked(object sender, EventArgs e)
{
    //Hide userControl11 and show userControl21 
}

示例 - 使用界面

我假设,您有一个包含一些标准方法的接口(interface):

public interface IDoSomething
{
    void DoSomething();
    void DoSomethingElse();
}

并且您已经在您的父表单中实现了该接口(interface):

public class Form1: Form, IDoSomething
{
    // ...

    public void DoSomething()
    {
        //Hide userControl11 and show userControl21 
    }
    public void DoSomethingElse()
    {
        // ...
    }
}

然后在你的用户控件中:

private void Button1_Click(object sender, EventArgs e)
{
    var f = FindForm() as IDoSomething;
    if(f!=null)
        f.DoSomething();
}

关于c# - 在用户控件单击事件中切换主窗体中的用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55053527/

相关文章:

c# - 如何在 C# 中为当前程序集设置 app.config 文件?

javascript - ASP.NET DataGrid ClientID 值返回 null

.net - 识字编程

c# - Json.NET 和混淆,反序列化不起作用

c# - Selenium - 'ITimeouts.ImplicitlyWait(TimeSpan)' 已过时

c# - 我可以用另一个线程检测挂起的进程并从中恢复吗?

c# - 微软测试 : Getting executing teSTLocation?

c# - 如何在C#中获取MonthCalendar控件的选定日期

c# - 在不重新启动程序的情况下更新列表框?

c# - 从父窗体中删除用户控件