用户控件将事件传递回父表单

时间:2015-02-23 20:32:21

标签: c# events delegates

我有一个附有3个用户控件的主表单。如何在特定用户控件中找到事件并修改其他两个用户控件的UI而不创建意大利面条代码?

主要表格(Form1.cs)

    public partial class Form1 : Form
   {
      private UserControl1 userControl11;
      private UserControl2 userControl21;
      private UserControl3 userControl31;

      public Form1()
      {
         InitializeComponent();
      }
   }

UserControl1.cs

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Change buttons around and fill in some data on user control 2 and 3
    }

    private void button2_Click(object sender, EventArgs e)
    {
        // Remove certain elements from control2 and 3
    }

    // .. So forth
}

我会在其他两个用户控件上执行许多不同的事情。我正在创建一个类似于Visual Studio的基本界面,我可以在其中打开项目,关闭它们,添加文件等。在一个表单上的这些操作应该加载不同的窗口,例如在其他控件中。实现这一目标的最佳方法是什么?创建自定义事件并解析主窗体中的每个事件?或直接从第一个访问每个用户控件?还是...?

2 个答案:

答案 0 :(得分:1)

事件的一般模式是:

public class MyClass{
public static EventHanlder<ofSomeType> MyEventHandler;

public void MyClass{
        MyEventHandler = _MyEventHandler;
}
public void _MyEventHandler(object sender, OfSomeType args){
      //do something with passed in args.
}
}

其他类会使用这样的事件处理程序......

public class myOtherClass{
   public void doSomething(){
      //do something here and signal the other class
      var ofSomeTypeData = GetData();        
      MyClass.MyEventHandler(ofSomeTypeData);        
   }
}

有些人会认为这种风格过于紧密,但它完美无缺,是一个良好的开端。

答案 1 :(得分:0)

在每个UserControl中创建一个事件。 Form1应该订阅这些控件上的事件。

假设UserControl1允许用户对数据进行排序。然后你可以这样写:

public Form1()
{
   InitializeComponent();
   // I assume UserControl1 was created by this point
   userControl1.OnDataSorted = DataSorted;
}

// This will be called when the user wants to sort the data
private void DataSorted(UserControl1 sender, EventArgs e)
{
   // Change buttons around and fill in some data on user control 2 and 3
}

然后,您将在UserControl中创建一个事件和一个委托。

public class UserControl1 {

   public delegate void DataSortedDelegate(UserControl1 sender, EventArgs e);

   public event DataSorted OnDataSorted;

   private void button1_Click(object sender, EventArgs e)
   {
      if (OnDataSorted != null)
         OnDataSorted(this, EventArgs.Empty);
      // Replace EventArgs.Empty above with whatever data Form1 needs
   }

此方法在Usercontrol1和Form1之间创建了一个关注点分离。该控件不需要实际修改Form1中的私有控件。它只是通知Form1发生了某些事情,并允许Form1进行更改。