系统菜单是通过反射从数据库中读取动态生成的。现在的问题是,打开多个子窗体后,再点击已打开的某个子窗体的菜单,这个子窗体不获得焦点。虽然也不妨碍程序运行,但总是觉得不好。。我大致知道原因出在哪里,因为有这个判断条件 //判断窗体是否已经加载
if (loadedPlugins.Contains(t.FullName))
{
return;
}但是又不知道怎么改才能在第二次点击该菜单时重新使该菜单对应的子窗体活的焦点。。还有一个问题是点击当前活动子窗体的Tab栏时会弹出一个新窗口,并在这个新窗口中显示这个子窗体,如何才能阻止这个新窗口的弹出?也就是怎么做才能使双击Tab栏不让程序有新窗口弹出。。public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
public static string uname = string.Empty;
public static string uid = string.Empty;
public static string identity = string.Empty;
public frmMain(DataTable dt)
{
InitializeComponent();
uname = dt.Rows[0]["username"].ToString();
identity = dt.Rows[0]["userdesc"].ToString();
uid = dt.Rows[0]["userid"].ToString();
this.WindowState = FormWindowState.Maximized;
}
DataTable dt = new DataTable();//存储权限数据
Dictionary<string, Plugin> plugins = new Dictionary<string, Plugin>();//存储已经加载菜单的信息
List<string> loadedPlugins = new List<string>();//存储已经显示出来的窗体信息,防止重复打开同一个窗体
Dictionary<string, Bar> loadedBars = new Dictionary<string, Bar>(); //存储已经加载的Image工具栏
private void frmMain_Load(object sender, EventArgs e)
{
barButtomItemUsername.Caption += uname;
barButtomItemIdentity.Caption += identity;
//查询数据库操作
IDataAccess data = DataAccessFactory.CreateDataAccess();
data.Open();
string sql = "select * from roleright,sysfun,userinfo where userinfo.roleid=roleright.roleid and roleright.nodeid = sysfun.nodeid and userinfo.username=@username"; dt = data.GetDataTable(sql, new QueryParameter("username",uname, DbType.String)); data.Close();
//初始化工具栏
this.barManager1.BeginInit();
this.barManager1.EndInit(); //加载菜单
DataRow[] drs = dt.Select("parentnodeid = 0");
foreach (DataRow dr in drs)
{
//创建横向父菜单
BarSubItem barSubItem = new BarSubItem(barManager1, dr["displayname"].ToString());
mainMenu.InsertItem(mainMenu.ItemLinks[mainMenu.ItemLinks.Count - 1], barSubItem);
//加载子菜单
foreach (DataRow item in dt.Rows)
{
if (dr["nodeid"].ToString() == item["parentnodeid"].ToString())
{
BarItem barSmallItem = new BarButtonItem(this.barManager1, item["displayname"].ToString());
barSubItem.AddItem(barSmallItem);
//注册事件
barSmallItem.ItemClick += new ItemClickEventHandler(barSmallItem_ItemClick);
Plugin plugin = new Plugin();
plugin.ClassName = item["fullfrmname"].ToString();
plugin.DisplayName=item["displayname"].ToString();
plugin.NameSpace=item["namespacename"].ToString();
plugin.Extends="dll"; //将所有加载成功的菜单保存至集合
plugins.Add(item["displayname"].ToString(),plugin);
}
}
}
} void barSmallItem_ItemClick(object sender, ItemClickEventArgs e)
{
try
{
//反射菜单对应的窗体
string path = Application.StartupPath + "\\";
Plugin plugin = plugins[e.Link.Caption]; 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); //成功打开窗体后将窗体信息存入List
loadedPlugins.Add(t.FullName); //显示工具栏
Bar childBar = obj.BaseBar;
this.mainFrameToolBar.Visible = true;
this.mainFrameToolBar.UnMerge();
this.mainFrameToolBar.Merge(childBar); //存储工具栏信息
if (!loadedBars.ContainsKey(e.Link.Caption))
loadedBars.Add(e.Link.Caption, childBar);
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
} //子窗体切换时重新加载工具栏 private void dockPanel1_ActiveDocumentChanged(object sender, EventArgs e)
{ if (loadedBars.Count > 0)
{
if (this.dockPanel1.ActiveDocument!=null)
{
Bar activeBar = loadedBars[this.dockPanel1.ActiveDocument.DockHandler.TabText];
if (activeBar != null && activeBar.ItemLinks.Count > 0)
{
this.mainFrameToolBar.UnMerge();
this.mainFrameToolBar.Merge(activeBar);
this.mainFrameToolBar.Visible = true;
}
}
}
} //关闭一个选项卡时将这个窗体的信息从集合中移除
private void dockPanel1_ContentRemoved(object sender, WeifenLuo.WinFormsUI.DockContentEventArgs e)
{
if (loadedPlugins.Contains(e.Content.DockHandler.Form.GetType().FullName))
{
loadedBars.Remove(e.Content.DockHandler.TabText);
loadedPlugins.Remove(e.Content.DockHandler.Form.GetType().FullName);
}
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.ProcessName.Contains("SystemLogin"))
{
p.Kill();
}
}
}
if (loadedPlugins.Contains(t.FullName))
{
return;
}但是又不知道怎么改才能在第二次点击该菜单时重新使该菜单对应的子窗体活的焦点。。还有一个问题是点击当前活动子窗体的Tab栏时会弹出一个新窗口,并在这个新窗口中显示这个子窗体,如何才能阻止这个新窗口的弹出?也就是怎么做才能使双击Tab栏不让程序有新窗口弹出。。public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
public static string uname = string.Empty;
public static string uid = string.Empty;
public static string identity = string.Empty;
public frmMain(DataTable dt)
{
InitializeComponent();
uname = dt.Rows[0]["username"].ToString();
identity = dt.Rows[0]["userdesc"].ToString();
uid = dt.Rows[0]["userid"].ToString();
this.WindowState = FormWindowState.Maximized;
}
DataTable dt = new DataTable();//存储权限数据
Dictionary<string, Plugin> plugins = new Dictionary<string, Plugin>();//存储已经加载菜单的信息
List<string> loadedPlugins = new List<string>();//存储已经显示出来的窗体信息,防止重复打开同一个窗体
Dictionary<string, Bar> loadedBars = new Dictionary<string, Bar>(); //存储已经加载的Image工具栏
private void frmMain_Load(object sender, EventArgs e)
{
barButtomItemUsername.Caption += uname;
barButtomItemIdentity.Caption += identity;
//查询数据库操作
IDataAccess data = DataAccessFactory.CreateDataAccess();
data.Open();
string sql = "select * from roleright,sysfun,userinfo where userinfo.roleid=roleright.roleid and roleright.nodeid = sysfun.nodeid and userinfo.username=@username"; dt = data.GetDataTable(sql, new QueryParameter("username",uname, DbType.String)); data.Close();
//初始化工具栏
this.barManager1.BeginInit();
this.barManager1.EndInit(); //加载菜单
DataRow[] drs = dt.Select("parentnodeid = 0");
foreach (DataRow dr in drs)
{
//创建横向父菜单
BarSubItem barSubItem = new BarSubItem(barManager1, dr["displayname"].ToString());
mainMenu.InsertItem(mainMenu.ItemLinks[mainMenu.ItemLinks.Count - 1], barSubItem);
//加载子菜单
foreach (DataRow item in dt.Rows)
{
if (dr["nodeid"].ToString() == item["parentnodeid"].ToString())
{
BarItem barSmallItem = new BarButtonItem(this.barManager1, item["displayname"].ToString());
barSubItem.AddItem(barSmallItem);
//注册事件
barSmallItem.ItemClick += new ItemClickEventHandler(barSmallItem_ItemClick);
Plugin plugin = new Plugin();
plugin.ClassName = item["fullfrmname"].ToString();
plugin.DisplayName=item["displayname"].ToString();
plugin.NameSpace=item["namespacename"].ToString();
plugin.Extends="dll"; //将所有加载成功的菜单保存至集合
plugins.Add(item["displayname"].ToString(),plugin);
}
}
}
} void barSmallItem_ItemClick(object sender, ItemClickEventArgs e)
{
try
{
//反射菜单对应的窗体
string path = Application.StartupPath + "\\";
Plugin plugin = plugins[e.Link.Caption]; 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); //成功打开窗体后将窗体信息存入List
loadedPlugins.Add(t.FullName); //显示工具栏
Bar childBar = obj.BaseBar;
this.mainFrameToolBar.Visible = true;
this.mainFrameToolBar.UnMerge();
this.mainFrameToolBar.Merge(childBar); //存储工具栏信息
if (!loadedBars.ContainsKey(e.Link.Caption))
loadedBars.Add(e.Link.Caption, childBar);
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
} //子窗体切换时重新加载工具栏 private void dockPanel1_ActiveDocumentChanged(object sender, EventArgs e)
{ if (loadedBars.Count > 0)
{
if (this.dockPanel1.ActiveDocument!=null)
{
Bar activeBar = loadedBars[this.dockPanel1.ActiveDocument.DockHandler.TabText];
if (activeBar != null && activeBar.ItemLinks.Count > 0)
{
this.mainFrameToolBar.UnMerge();
this.mainFrameToolBar.Merge(activeBar);
this.mainFrameToolBar.Visible = true;
}
}
}
} //关闭一个选项卡时将这个窗体的信息从集合中移除
private void dockPanel1_ContentRemoved(object sender, WeifenLuo.WinFormsUI.DockContentEventArgs e)
{
if (loadedPlugins.Contains(e.Content.DockHandler.Form.GetType().FullName))
{
loadedBars.Remove(e.Content.DockHandler.TabText);
loadedPlugins.Remove(e.Content.DockHandler.Form.GetType().FullName);
}
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.ProcessName.Contains("SystemLogin"))
{
p.Kill();
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货