在用户控件单击事件中以主窗体切换用户控件

时间:2019-03-07 22:04:10

标签: c# .net winforms instance

这听起来很愚蠢,但是我很难弄清楚这一点。任何帮助将不胜感激:

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

安全性检查用户控件;

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();
        }
    }

MainForm:

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();
            }
     }

我要做的是在“ 安全检查 ”上有一个名为“ Button1 ”的按钮”用户控件,每当我按此按钮时,我都希望“ 安全检查 ”消失在“ pnl_main_controller ”上并带来“ OEE_Track ”进入面板

1 个答案:

答案 0 :(得分:1)

我想稍微介绍一下Reza Aghaei的答案。我认为它可能会变得比现在更好。

第一种方法

如果我是你,我将有一个接口ICheckedView,该接口至少有一种实现方法,如下所示:

ICheckedView
{
    void Continue();
}

现在,我们可以将此接口应用于解决方案中的任何类,但最有可能应用于视图。接下来,我将使您的主窗体实现此接口并实现所需的方法。在这种情况下,我们希望主窗体从面板中删除控件,然后添加一个新控件。坦白说,我们的安全检查控件不需要(也许不应该)知道其他控件或接下来会发生什么。它只是用于控制流程。

最后,您需要为Public_Check添加一个公共属性,或者甚至向构造函数添加一个参数(其中包含ICheckedView)。当您的安全检查控件被点击时,它可以告诉任何传递给它的人(我们称客户)必须继续。

第二种方法

可以用action delegate完成。

如果将Action委托添加到安全检查中,则可以仅弹出其签名与该委托匹配的任何方法(void methodName())。 Safety_Check控件的构造函数应包括一个Action,并且该Action将被分配给该类的私有字段。然后,当需要调用时,可以直接调用该动作。

有关此方法的注意事项

因为我们可能首先是从UI线程调用的,所以我们可能还不错,但是您需要在这里考虑线程安全性。所需调用模式可以帮助您解决此问题。