MDI窗體是個什么東東尼?多文檔窗體嘮,相對的還有個SDI,就是單文檔窗體。一般情況下我們會將軟件的主窗體設置為MDI窗體。那么在主窗體的菜單部分調出來的其他窗體就是主窗體的子窗體了。
(1)在主窗體中如何調用一個子窗體尼?貼代碼啦,這段代碼當然是寫在主窗體里面的按鈕或者菜單事件里面,很簡單嘮
private void 比賽科目ToolStripMenuItem_Click(object sender, EventArgs e) { Form childForm = new Form(); childForm.MdiParent = this; childForm.Text = "窗口 " ; childForm.WindowState = FormWindowState.Maximized;//子窗體在父窗體中最大化 childForm.Show(); }
(2)子窗體的排序,如果我們系統新建一個MDI父窗體,其實里面有代碼示例的,不過還是貼出來吧,子窗體的排列有層疊、水平平鋪、垂直平鋪等等
private void CascadeToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.Cascade);//層疊 } private void TileVerticalToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.TileVertical);//垂直平鋪 } private void TileHorizontalToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.TileHorizontal);//水平平鋪 } //關閉所有子窗體 private void CloseAllToolStripMenuItem_Click(object sender, EventArgs e) { foreach (Form childForm in MdiChildren) { childForm.Close(); } }
(3)還涉及到一個問題,就是同一個子窗體不能重復打開吧,嗯,這需要解決一下,代碼上
/// <summary> /// 檢查打開的MDI窗口,是否有打開,如有打開,激活即可,不做重復打開 /// </summary> /// <param name="Frmname"></param> private bool CheckFrm(Form cForm) { foreach (Form sonfrm in this.MdiChildren) { if (sonfrm.Name == cForm.Name) { return false; } } return true; } private void ShowNewForm(object sender, EventArgs e) { Form childForm = new Form(); childForm.Text = "窗口 "; childForm.Name = "StudentForm"; if (CheckFrm(childForm)) { childForm.MdiParent = this; childForm.Show(); childForm.Activate(); } else { childForm.Activate(); childForm.WindowState = FormWindowState.Normal; } }
// 對於非MDI窗體同樣可以使用如下方法檢測 private bool CheckOpen(Form cForm) { foreach (Form frm in Application.OpenForms) //遍歷已打開窗口 { if (frm.Name == cForm.Name) //如果此窗口已打開 { frm.Activate() ; //激活當前窗體 if(frm.WindowState==FormWindowState.Minimized) //如果當前窗體已經最小化 { frm.WindowState=FormWindowState.Normal; //還原窗體 } return true; } } return false; }
本人采用的方法,感覺還不錯
在MDI父窗口中放一個splitContainer1進去,將MDI子窗體的父組件設置成splitContainer1的一個panel,這種適合左側有快捷菜單的。先上個圖
這樣可以將子窗體放到pannel2里面了。上代碼
/// <summary> /// 菜單運動員信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 運動員信息ToolStripMenuItem_Click(object sender, EventArgs e) { ShowMemberInfoFrm(); } /// <summary> /// 展示運動員信息管理窗口 /// </summary> private void ShowMemberInfoFrm() { this.splitContainer1.Panel2.Controls.Clear();//這個地方直接把當前顯示的子窗體干掉,然后顯示新窗體 MemberInfoFrm frm = new MemberInfoFrm(); frm.MdiParent = this; frm.Parent = splitContainer1.Panel2; frm.Show(); frm.Dock = DockStyle.Fill;//這個很有用,就是子窗體全部充滿整個右側的pannel,並隨着pannel的大小跟隨變化 }
這里有一個問題,不管是MDI窗體還是本人采用的pannel,都可以采用窗體重復打開檢測,即(3)中的方法進行檢查,然后激活即可。但是試驗證明激活不了,覆蓋掉的窗體不會顯示到最前面來,有朋友說用TopMost或TopLevel屬性,本人試了,還是不行。如果朋友們有好的辦法,請貼上代碼,謝謝。