通用角色和反射机制开发实例控件及实现功能介绍

 

一、新建一个IPlugin接口

/// <summary>

    /// 表示:实现类必须以插件的形式表现;表示实现类是一个插件
    /// </summary>
    public interface IPlugin
    {
        Bar BaseBar { get; set; }
        void ShowDlg(DockPanel dockPanel, string pluginName);

    }



二、新建一个frmBase基类窗体

using DevExpress.XtraBars;
using WeifenLuo.WinFormsUI;

public partial class frmBase : DockContent, IPlugin 、

//DockContent是一个叫weifenluo的第三控件网上有下载。所以要添加该引用 using WeifenLuo.WinFormsUI

//Bar 是DevExpress的控件 ,也要添加该引用 using DevExpress.XtraBars
    {
       private Bar _pBar;


        public Bar PBar
        {
            get { return _pBar; }
            set { _pBar = value; }
        }
        public frmBase()
        {
            _pBar = new Bar();
            InitializeComponent();
        }


        #region IPlugin 成员


        public void ShowDlg(DockPanel dockPanel, string pluginName)
        {
            this._pBar.Visible = false;
            baseBar = _pBar;
            this.TabText = pluginName;
            this.Show(dockPanel);
        }


        private Bar baseBar;


        public Bar BaseBar
        {
            get { return baseBar; }
            set { baseBar = value; }
        }
       
        #endregion
    }

三、子窗体代码如下

public partial class frmDelete : frmBase //删除窗体
    {
        public frmDelete()
        {
            InitializeComponent();
            base.PBar = this.barDelete;
        }
    }


public partial class frmReg: frmBase //注册窗体
    {
        public frmReg()
        {
            InitializeComponent();
            base.PBar = this.barReg;
        }
    }


public partial class frmModify : frmBase //修改窗体
    {
        public frmModify()
        {
            InitializeComponent();
            base.PBar = this.barModify;
        }
    }


四、主窗体代码如下


      public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }


        DataTable dt = new DataTable();
        Dictionary<string, Plugin> plugins = new Dictionary<string, Plugin>();//存储已经加载的菜单信息
        List<string> loadedPlugins = new List<string>();//存储已经显示出来的窗体信息,就意思是你别再显示出来了
        Dictionary<string, Bar> loadeBars = new Dictionary<string, Bar>();
        //存储已经显示出来的工具栏
        private void frmMain_Load(object sender, EventArgs e)
        {
            //Form2 frm = new Form2();
            //frm.Show(dockPanel1);
          dt=  SQLHelper.ExecuteDataTable("select * from UserInfo,SysFun,RoleRight where UserInfo.RoleId=RoleRight.RoleId and RoleRight.NodeId=SysFun.NodeId and UserInfo.UserId=@uid", new SqlParameter("@uid", "admin"));
          this.xafBarManager1.BeginInit();
          this.xafBarManager1.EndInit();
          DataRow[] drs = dt.Select("ParentNodeId=0");
          foreach (DataRow  dr in drs)
          {
              BarSubItem barSubItem = new BarSubItem(this.xafBarManager1,dr["DisplayName"].ToString());
              mainMenu.InsertItem(mainMenu.ItemLinks[mainMenu.ItemLinks.Count-1],barSubItem);
              foreach (DataRow  dar in dt.Rows)
              {
                  if (dr["NodeId"].ToString() == dar["ParentNodeId"].ToString())
                  {
                      BarItem barSamllItem = new BarButtonItem(this.xafBarManager1,dar["DisplayName"].ToString());
                      barSubItem.AddItem(barSamllItem);
                      //注册事件
                      barSamllItem.ItemClick += new ItemClickEventHandler(barSamllItem_ItemClick);
                      //将所有加载成功的菜单信息保存起来 集合
                      plugins.Add(dar["DisplayName"].ToString(),new Plugin{ClassName=dar["FullFrmName"].ToString(),DisplayName=dar["DisplayName"].ToString(),Extends="exe",NameSpace=dar["NameSpaceName"].ToString()});
                  }
              }
          }
        }


        void barSamllItem_ItemClick(object sender, ItemClickEventArgs e)
        {
            string path = Application.StartupPath + "\\";
                //@"D:\VS2010\Demo\WeiFengluo\weifengluoDemo\Forms\";// 
            Plugin plugin = plugins[e.Link.Caption];


            //D:\VS2010\Demo\WeiFengluo\weifengluoDemo\Forms
            Assembly ab = Assembly.LoadFrom(path + plugin.NameSpace + "." + plugin.Extends);//
            Type[] types = ab.GetTypes();
            foreach (Type t in types)
            {
                if(t.GetInterface("IPlugin")!=null&&t.Name==plugin.ClassName)
                {
                //判断该类是否加载成功
                    if (loadedPlugins.Contains(t.FullName))
                        return;
                    //根据菜单信息 反射窗体
                    IPlugin obj = (IPlugin)ab.CreateInstance(t.FullName);
                    obj.ShowDlg(this.dockPanel1,e.Link.Caption);
                    
                    //显示成功后存入信息
                    loadedPlugins.Add(t.FullName);
                    //显示工具栏
                    Bar childbar = obj.BaseBar;
                    this.newBar.Visible = true;
                    this.newBar.UnMerge();
                    this.newBar.Merge(childbar);
                    //存储已经显示出来的工具栏
                    if (!loadeBars.ContainsKey(e.Link.Caption))
                        loadeBars.Add(e.Link.Caption,childbar);
                }
            }
        }


        private void dockPanel1_ActiveDocumentChanged(object sender, EventArgs e)
        {
            //if (!loadeBars.ContainsKey(dockPanel1.ActiveDocument.DockHandler.TabText))
            //    return;
        }


        private void dockPanel1_ContentRemoved(object sender, WeifenLuo.WinFormsUI.DockContentEventArgs e)
        {
            //在关闭一个选项卡的时候要把这个窗体集合中移除掉要不然你再请求显示窗体时就不会显示了
            if (loadedPlugins.Contains(e.Content.DockHandler.Form.GetType().FullName))
            {
                loadeBars.Remove(e.Content.DockHandler.TabText);
                loadedPlugins.Remove(e.Content.DockHandler.Form.GetType().FullName);
            }
        }
    }



更新中............

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值