让UserControl在MainForm中注册事件

时间:2013-08-07 08:51:09

标签: c# winforms user-controls

我目前正在开发Winforms解决方案,其中包含一个包含ToolStrip和Panel的主窗体。该解决方案是一种管理工具。 该面板填充了一个用户控件,通常包含输入表单或某种ListView。 根据单击的按钮,Panel中的用户控件将替换为另一个用户控件。

到目前为止一切顺利。现在更棘手的部分是用户可以是一个或多个部门的管理员,如果用户是多个部门的管理员,一些用户控件将显示ComboBox,管理员可以选择哪个部门管理员。但是,某些用户控件独立于部门,因此不包含ComboBox

现在的问题是,不是将ComboBox添加到特定于部门的用户控件中,而是考虑将其添加到主窗体并拥有用户控件,在实例化时,查看哪个部门被选中并相应地填充数据。 但我的问题是:当用户然后选择ComboBox中的另一个部门时,我将告诉孩子(用户控件)该值已更改。

我的第一个想法是让用户控制 - 实例化时 - 注册更改事件。但我似乎无法弄清楚如何开始工作(反过来更容易)。 我一直在考虑的另一种方法是在值发生变化时从主窗体调用用户控件中的方法。但是,不能保证存在这样的方法,因为并非所有用户控件都需要此功能。

对此有优选/黄金解决方案吗?我缺少的东西或者这只是不好的做法/设计?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我创建了一个表单和一个用户enter code here控件(名为UserControl1)并将其添加到表单中。我在表单中添加了comboBox,然后执行了操作:

 public Form1()
 {
     InitializeComponent();
     comboBox1.SelectedValueChanged += userControl11.comboBox1_SelectedValueChanged;
 }

然后当用户控件的comboBox1知道它并且可以重新启动

答案 1 :(得分:1)

当需要通知childcontrols时,我会实现一个接口。你应该避免交叉调用方法/事件处理,因为事件可能导致" ghost控件"和不可读的代码。

我会这样做:(伪/未测试)

public interface IDepartmentChanged
{
   void DepartmentChanged(int departmentId);
}


public class UserControl1 : UserControl, IDepartmentChanged
{
    public void DepartmentChanged(int departmentId)
    {
      // refresh data
    }
}

public class Form1 : Form
{
   // Add all UserControls to a List  => _controls 
   private List<UserControl> _controls = new List<UserControl>();

   public Form1()
   {
       InitializeComponent();
       _controls.Add(userControl11);
   }

   private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
   {
        int selectedDepartmentId = ((MyData)comboBox1.SelectedValue).Id;

        foreach (UserControl control in _controls)
            if (control is IDepartmentChanged)
                ((IDepartmentChanged)control).DepartmentChanged(selectedDepartmentId);

        // or even shorter:
        foreach (IDepartmentChanged departmentChanged in _controls.OfType<IDepartmentChanged>())
            departmentChanged.DepartmentChanged(selectedDepartmentId);
   }

在此方法中,子功能完全与父功能分开。(OOP)