0

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

到现在为止还挺好。现在更棘手的部分是用户可以是一个或多个部门的管理员,如果用户是多个部门的管理员,一些用户控件将显示ComboBox管理员可以选择管理哪个部门的位置。但是,一些用户控件独立于部门,因此不包含ComboBox.

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

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

对此有首选/黄金解决方案吗?我错过了什么,或者这只是不好的做法/设计?

提前致谢!

4

2 回答 2

1

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

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

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

于 2013-08-07T09:02:18.470 回答
1

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

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

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)

于 2013-08-07T09:17:40.287 回答