为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
不负相思意 2022-10-15 15:04:29
这听起来可能很愚蠢,但我很难弄清楚这一点;任何帮助,将不胜感激:我有两个名为“ 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 ”带到面板
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

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

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

  • 他们可以要求另一个知道这两个控件的对象来为他们完成这项工作。

  • 或者他们可以提出他们的请求通知,订阅该通知的人将提供它。

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

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

示例 - 使用事件

我假设你有UserControl1内部Button1并且你已经处理ClickButton1. 然后您可以创建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();

}


查看完整回答
反对 回复 2022-10-15
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我想稍微扩展一下 Reza Aghaei 的回答。我认为它可以变得比现在更好。

第一种方法

如果我是你,我会有一些接口ICheckedView,它至少有 1 种方法来实现,如下所示:

ICheckedView{
    void Continue();}

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

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

第二种方法

它可以通过动作委托来完成。

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

此方法的注意事项

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


查看完整回答
反对 回复 2022-10-15
  • 2 回答
  • 0 关注
  • 58 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信