我有一个附有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的基本界面,我可以在其中打开项目,关闭它们,添加文件等。在一个表单上的这些操作应该加载不同的窗口,例如在其他控件中。实现这一目标的最佳方法是什么?创建自定义事件并解析主窗体中的每个事件?或直接从第一个访问每个用户控件?还是...?
答案 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进行更改。