一、新建一个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);
}
}
}
更新中............