委托小技巧:1)哪个窗体(B窗体)要调用委托变量,哪个窗体自己创建委托变量对象。即谁激发(invoke),谁创建。
2)委托的事情是哪个窗体(A窗体)执行,委托关联的方法就定义在哪个窗体。
3)委托变量和方法的管理,需要从【创建调用窗体B】(窗体A或其他窗体)的地方进行关联
事件:事件是委托的进一步包装。
this.btnCreateChildForm.Click += new System.EventHandler(this.btnCreateChildForm_Click);
public event EventHandler Click
public delegate void EventHandler(object sender, EventArgs e);
项目FrmMain 嵌套左侧窗体FrmLeft和右侧窗体FrmRight,现在实现点击左侧嵌套窗体按钮(调用线圈),主窗体重新嵌套右侧窗体的效果。
FrmMain: 定义委托方法体
#region 委托方法体
/// <summary>
/// 主界面显示右侧线圈数据的窗体
/// </summary>
/// <param name="objFormRight"></param>
public void UpdateCoilRightUI(FrmCoilRight objFormRight)
{
OpenForm(objFormRight, panelRight);
}
#endregion
#region 嵌入窗体显示
//关闭嵌入的窗体
private void ClosePreForm( Panel panel)
{
foreach (Control item in panel.Controls)
{
if (item is Form)
{
Form objControl = (Form)item;
objControl.Close();
}
}
}
//打开窗口新窗体
private void OpenForm(Form objForm, Panel panel)
{
ClosePreForm(panel);//关闭前面的窗体
objForm.TopLevel = false;//将子窗体设置成非顶级控件
objForm.FormBorderStyle = FormBorderStyle.None;//去掉子窗体的边框
objForm.Parent = panel;//指定子窗体显示的容器
objForm.Dock = DockStyle.Fill;//随着容器大小自动调整窗体大小
objForm.Show();
}
#endregion
FrmLeft: //创建委托对象并绑定方法体 //调用委托 嵌入窗体
/// <summary>
/// 调用线圈文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnCoilRead_Click(object sender, EventArgs e)
{
。。。。
//更新右侧窗体数据
FrmCoilRight objFormRight = new FrmCoilRight(OpenFilePath);
//创建委托对象并绑定方法体
FrmMain frmMain =(FrmMain) this.Parent.Parent.Parent;
Action<FrmCoilRight> actionCoilData = frmMain.UpdateCoilRightUI;
//调用委托 嵌入窗体
actionCoilData(objFormRight);
}
FrmRight:
/// <summary>
/// 根据数据文档路径初始化线圈数据文件
/// </summary>
/// <param name="fileName"></param>
public FrmCoilRight( string fileName)
{
InitializeComponent();
txtToolTips1.Text = "委托提示信息";
}