动态创建业务窗体
我们在上一节中只讲了子菜单的滑入和滑出事件,而没有讲单击事件,单击事件就是创建业务窗体的事件了
来看一下代码
/// <summary>
/// 子菜单弹起事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void sm_MouseUp(object sender, MouseEventArgs e)
{
var lb = sender as Label;
var m = lb.Tag as MenuModel;
if (string.IsNullOrEmpty(m.Url))
{
Utils.Alert("没有与此菜单相关的业务窗体");
return;
}
BaseForm f = null;
foreach(var hf in FormHistory)
{
if (hf.FormMenu.Url.Equals(m.Url))
{
f = hf;
break;
}
}
if (f == null)
{
f = CreateOneForm(m);
f.SubMenu = lb;
}
if (f != null&&!f.Visible)
{
f.Show();
}
}
/// 子菜单弹起事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void sm_MouseUp(object sender, MouseEventArgs e)
{
var lb = sender as Label;
var m = lb.Tag as MenuModel;
if (string.IsNullOrEmpty(m.Url))
{
Utils.Alert("没有与此菜单相关的业务窗体");
return;
}
BaseForm f = null;
foreach(var hf in FormHistory)
{
if (hf.FormMenu.Url.Equals(m.Url))
{
f = hf;
break;
}
}
if (f == null)
{
f = CreateOneForm(m);
f.SubMenu = lb;
}
if (f != null&&!f.Visible)
{
f.Show();
}
}
其实这个方法里的业务逻辑不多
主要的还是f = CreateOneForm(m);这一句
/// <summary>
/// 创建一个业务窗体;包括tab按钮
/// </summary>
/// <param name="m"></param>
private BaseForm CreateOneForm(MenuModel m)
{
var ass = this.GetType().Assembly;
var url = string.Format("XL.Client.Forms.{0}", m.Url);
BaseForm f = null;
try
{
f = ass.CreateInstance(url) as BaseForm;
}
catch
{
Utils.Alert("没有与此菜单相关的业务窗体");
return null;
}
f.Dock = DockStyle.Fill;
f.FormMenu = m;
var tabBtn = new TabBTN();
tabBtn.OnClose += new EventHandler(f.tbn_OnClose);
tabBtn.OnSelect += new EventHandler(f.tbn_OnSelect);
tabBtn.Caption = m.MenuName;
int left = 6;
var tabCount = TabContainerP.Controls.Count;
if (tabCount > 0)
{
var lastTab = TabContainerP.Controls[tabCount - 1];
left += (lastTab.Left + lastTab.Width);
}
tabBtn.Left = left;
TabContainerP.Controls.Add(tabBtn);
f.FormTabBTN = tabBtn;
return f;
}
/// 创建一个业务窗体;包括tab按钮
/// </summary>
/// <param name="m"></param>
private BaseForm CreateOneForm(MenuModel m)
{
var ass = this.GetType().Assembly;
var url = string.Format("XL.Client.Forms.{0}", m.Url);
BaseForm f = null;
try
{
f = ass.CreateInstance(url) as BaseForm;
}
catch
{
Utils.Alert("没有与此菜单相关的业务窗体");
return null;
}
f.Dock = DockStyle.Fill;
f.FormMenu = m;
var tabBtn = new TabBTN();
tabBtn.OnClose += new EventHandler(f.tbn_OnClose);
tabBtn.OnSelect += new EventHandler(f.tbn_OnSelect);
tabBtn.Caption = m.MenuName;
int left = 6;
var tabCount = TabContainerP.Controls.Count;
if (tabCount > 0)
{
var lastTab = TabContainerP.Controls[tabCount - 1];
left += (lastTab.Left + lastTab.Width);
}
tabBtn.Left = left;
TabContainerP.Controls.Add(tabBtn);
f.FormTabBTN = tabBtn;
return f;
}
我们把菜单的URL字段拿出来,反射了一个业务窗体的实例
然后创建了tab按钮的实例,并让这个业务窗体持有这个实例
注意tab按钮的close和select事件是怎么注册的哦~
原文链接:http://www.cnblogs.com/liulun/archive/2011/12/08/2280110.html