技术开发 频道

WinForm应用框架:动态创建业务窗体

  动态创建业务窗体

  我们在上一节中只讲了子菜单的滑入和滑出事件,而没有讲单击事件,单击事件就是创建业务窗体的事件了

  来看一下代码

        /// <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();
            }
        }

   其实这个方法里的业务逻辑不多

  主要的还是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;
        }

   我们把菜单的URL字段拿出来,反射了一个业务窗体的实例

  然后创建了tab按钮的实例,并让这个业务窗体持有这个实例

  注意tab按钮的close和select事件是怎么注册的哦~

  原文链接:http://www.cnblogs.com/liulun/archive/2011/12/08/2280110.html

  前一篇文章:WinForm企业应用框架设计:框架窗体设计和动态创建菜单;

0
相关文章