如何在MDI中相同的子窗体只保留一个实例
生活随笔
收集整理的這篇文章主要介紹了
如何在MDI中相同的子窗体只保留一个实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
閱讀: 107 評論: 1 作者: blackcore 發表于 2009-11-16 14:24 原文鏈接
很明顯,在一個MDI窗體中,一般來說每個菜單都會對應一個Form,當用戶多次單擊某個菜單時,而我們并不需要同時彈出多個與之對應的Form。
所以我們在菜單事件上加上子窗體是否存在的驗證就可以解決這個問題了。
代碼如下:
方法一:
?
Code///?
///?檢查MDI子窗體是否存在
///?
///?
///?
private?bool?IsChildFormExist(string?childFrmName)
{
????foreach?(Form?childFrm?in?this.MdiChildren)
????{
????????if?(childFrm.Name?==?childFrmName)?//用子窗體的Name進行判斷,如果存在則將他激活
????????{
????????????if?(childFrm.WindowState?==?FormWindowState.Minimized)
????????????{
????????????????childFrm.WindowState?=?FormWindowState.Normal;
????????????}
????????????childFrm.Activate();
????????????return?true;
????????}
????}
????return?false;
}
//調用示例如下
///?
///?用戶管理
///?
///?
///?
private?void?ToolStripMenuItem_UserManage_Click(object?sender,?EventArgs?e)
{
????if?(string.IsNullOrEmpty(currentLoginName))
????{
????????return;
????}
????//通過窗體名稱查詢該窗體是否已經存在,如存在則顯示,否則就新創建一個
????if?(!this.IsChildFormExist("UserForm"))
????{
????????UserForm?frmUser?=?new?UserForm();
????????frmUser.MdiParent?=?this;
????????frmUser.WindowState?=?FormWindowState.Maximized;
????????frmUser.Show();
????}
}
?
方法二:
?
Code///?
///?打開窗體
///?
///?
///? ????private?void?ShowWindow(string?mdiChildTypeString)
{
????Form?currentMdiChild?=?null;
????if?(!IsMDIChildFormExist(mdiChildTypeString))
????{
????????Assembly?assembly?=?Assembly.GetExecutingAssembly();
????????Type?typForm?=?assembly.GetType(mdiChildTypeString);
????????//關于InvokeMember用法,不明白的可以查看:http://msdn.microsoft.com/zh-cn/library/de3dhzwy(VS.80).aspx
????????Object?mdiChild?=?typForm.InvokeMember(
????????????null,
????????????BindingFlags.DeclaredOnly?|?BindingFlags.Public?|?BindingFlags.NonPublic?|?BindingFlags.Instance?|?BindingFlags.CreateInstance,
????????????null,
????????????null,
????????????null);
????????if?(mdiChild?!=?null)
????????{
????????????currentMdiChild?=?mdiChild?as?Form;
????????????currentMdiChild.MdiParent?=?this;
????????????currentMdiChild.WindowState?=?FormWindowState.Maximized;
????????????currentMdiChild.Show();
????????????currentMdiChild.Focus();
????????}
????}
}
///?
///?檢查MDI子窗體是否存在
///?
///?
///? ????????
private?bool?IsMDIChildFormExist(string?mdiChildTypeString)
{
????Form?currentMDIChild?=?null;
????foreach?(Form?mdiChildFrm?in?this.MdiChildren)
????{
????????if?(mdiChildFrm.GetType().ToString()?==?mdiChildTypeString)
????????{
????????????currentMDIChild?=?mdiChildFrm;
????????????break;
????????}
????}
????if?(currentMDIChild?!=?null)
????{
????????if?(currentMDIChild.WindowState?==?FormWindowState.Minimized)
????????{
????????????currentMDIChild.WindowState?=?FormWindowState.Normal;
????????}
????????currentMDIChild.TopMost?=?true;
????????currentMDIChild.Activate();
????????currentMDIChild.Focus();
????????return?true;
????}
????else
????{
????????return?false;
????}
}
//調用方法如下
///?
///?用戶管理
///?
///?
///?
private?void?ToolStripMenuItem_UserManage_Click(object?sender,?EventArgs?e)
{
????if?(string.IsNullOrEmpty(currentLoginName))
????{
????????return;
????}????
????ShowWindow(typeof(UserForm).ToString());
}
?
發表評論
新聞頻道:德國工程師稱破解GSM加密算法 影響80%手機安全
推薦鏈接:Windows 7專題發布
網站導航:博客園首頁??個人主頁??新聞??社區??博問??閃存??知識庫
轉載于:https://my.oschina.net/agile/blog/2125
總結
以上是生活随笔為你收集整理的如何在MDI中相同的子窗体只保留一个实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSIS数据流
- 下一篇: 自定义控件的时候为控件增加事件