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

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


我有两个名为“ 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();

            }        }



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


不负相思意
浏览 80回答 2
2回答

呼唤远方

控件之间的交互有多种解决方案。控件是类,并且与任何其他类一样,它们可以使用其公共属性和方法或使用某些中介来相互交互。在这种情况下,您的控件不需要相互了解,也不需要直接相互交互:他们可以要求另一个知道这两个控件的对象来为他们完成这项工作。或者他们可以提出他们的请求通知,订阅该通知的人将提供它。要让另一个对象为他们做这项工作,您有多种解决方案。例如,您可以在父窗体和子控件中实现特定接口,将父级强制转换为该特定接口并调用为您完成工作的特定方法。为了提高请求通知,一个简单的解决方案是依赖事件。您可以在子控件中创建一个事件,并在您需要父控件为您做某事时引发它。然后在父母中订阅该事件并完成工作。示例 - 使用事件我假设你有UserControl1内部Button1并且你已经处理Click了Button1. 然后您可以创建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 }示例 - 使用界面我假设,您有一个具有一些标准方法的接口:public interface IDoSomething{    void DoSomething();    void DoSomethingElse();}你已经在你的父表单中实现了接口: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();}

一只甜甜圈

我想稍微扩展一下 Reza Aghaei 的回答。我认为它可以变得比现在更好。第一种方法如果我是你,我会有一些接口ICheckedView,它至少有 1 种方法来实现,如下所示:ICheckedView{     void Continue();}现在,我们可以将此接口应用于解决方案中的任何类,但最有可能是视图。接下来,我会让你的主窗体实现这个接口并实现所需的方法。在这种情况下,我们希望我们的主窗体从面板中删除控件并添加一个新控件。坦率地说,我们的安全检查控件不需要(也许不应该)知道其他控件或接下来会发生什么。它仅用于控制流。最后,您需要为 Safety_Check添加一个公共属性,甚至可能是一个参数,ICheckedView其中包含一个参数。当您的安全检查控件被点击时,它可以告诉任何被传递给它的人(我们会说客户端)它必须继续。第二种方法它可以通过动作委托来完成。如果您Action在安全检查中添加一个委托,您可以直接弹出签名与该委托匹配的任何方法 ( void methodName())。您的 Safety_Check 控件的构造函数应包含一个 Action,并且该 Action 将被分配给该类的私有字段。然后,当需要调用时,可以直接调用该操作。此方法的注意事项因为我们可能首先从 UI 线程调用,所以我们可能没问题,但是您需要在这里考虑线程安全。调用所需模式可以帮助您解决这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP