【问题标题】:All user control instances should listen to a parent form event所有用户控件实例都应该监听父表单事件
【发布时间】:2022-10-21 02:09:58
【问题描述】:

我的父表单中有许多用户控件实例。现在,当我单击父表单中的按钮时,我希望所有用户控件都以类似的方式进行更改。我希望每个控件都监听父窗体中的事件,并在父窗体中的事件引发后进行更改,而不是循环遍历我的用户控件并告诉每个控件该做什么。 就像红绿灯一样:当它们变绿时,每辆车都会启动。我不必告诉每个司机开始驾驶。 这可能吗?

【问题讨论】:

  • 恐怕你已经找到答案了,再看一遍标题。
  • 我不知道如何在技术上做到这一点。据我了解,用户控件必须监听主窗体事件,实例也是如此。您能否提供一个代码 sn-p 如何做到这一点?
  • 您不需要为此举办活动。表单中的所有控件都包含在 Controls 集合中,请参见 InitializeComponent 函数中的代码,您可以在那里看到控件是如何创建、配置和附加到控件集合的。基于此,您可以简单地迭代此集合并识别您的“用户控件”,并在单击表单上的按钮时对它们执行任何操作
  • UserControl 有一个ParentForm 属性。获取到父窗体后,就可以获取到按钮,然后就可以监听按钮的OnClick事件了。
  • “当他们进入绿色时,每辆车都会启动”- 不,司机启动汽车。所以,你需要司机

标签: c# winforms


【解决方案1】:

.Net 实现了一个“观察者”通过事件和委托进行模式。

// this is a Pseudocode
form.button.Click += DoSomething; // (object, EventArgs)

DoSomething(...)
{
    foreach(Control in form.controls)
    {
       // do whatever you need with your control
    }     
}

现在它变得有趣了。可以说,您创建自定义按钮、文本框;然后你

public class CustomButton : Button.....
public class CustomTextBox : TextBox.....

// And in these ^^^ custom controls you can do this
override void ParentChanged(...)
{
    var form = this.FindForm();
    form.[SomeEvent] += Listen(.....); // (object, EventArgs)
    base.ParentChanged(...);
}

public void Listen(.....) // (object, EventArgs)
{
     // DO whatever you want with this control
     // for each control type will be different code
}

第二种方法让 .Net Observer 完成所有工作,但您需要进行继承。

第一种方法似乎更容易。只有你需要覆盖一些switch中的所有控件类型。在第二种方法中,每个控件类型都可以为自己做它需要做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多