是否有可用於判斷是否已添加或從MDI父窗體中刪除子窗體的事件?添加或刪除帶有子窗體的MDI窗體
回答
不,沒有。您必須對Form進行子類化,並公開指定何時添加子項的特定事件,然後通過將子表單連接起來的方法來發送子窗體的所有附件,以及引發事件。
是的。在您的主MDI表格上,連接到MdiChildActivated事件。
像這樣:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.MdiChildActivate += new EventHandler(Form1_MdiChildActivate);
}
void Form1_MdiChildActivate(object sender, EventArgs e)
{
MessageBox.Show("Activated");
}
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
Form form2 = new Form2();
form2.MdiParent = this;
form2.Show();
}
}
而當子窗體是既激活或取消該事件將觸發。
連線MdiChildActivate
事件並保留一個已識別孩子的列表。當一個新表格被激活時,還會連接FormClosed
事件。
private List<Form> ChildFormList = new List<Form>();
private void MyForm_MdiChildActivate(object sender, EventArgs e)
{
Form f = this.ActiveMdiChild;
if (f == null)
{
//the last child form was just closed
return;
}
if (!ChildFormList.Contains(f))
{
//a new child form was created
ChildFormList.Add(f);
f.FormClosed += new FormClosedEventHandler(ChildFormClosed);
}
else
{
//activated existing form
}
}
private void ChildFormClosed(object sender, FormClosedEventArgs e)
{
//a child form was closed
Form f = (Form)sender;
ChildFormList.Remove(f);
}
我意識到這是多年爲時已晚但作爲答案在這裏幫我解決這個我雖然我會提到這一點,使用MdiChildren陣列工作正常.NET 4,你需要做的唯一的事情就是檢查如果表格正在處理或處置以告知是否關閉。
即:
private void frmContainer_MdiChildActivate(object sender, EventArgs e)
{
tabWindows.RefreshLayout(this.MdiChildren.ToList());
}
public void RefreshLayout(List<Form> forms)
{
this.nextButtonLeft = 1;
panel1.Controls.Clear();
foreach (Form frm in forms)
{
if (!(frm.Disposing || frm.IsDisposed)) { addButton(frm); }
}
}
我最近想大致確定的時候有開,所以我可以顯示有大量的面板「的事情要做」按鈕就可以了,只有當沒有孩子的形式開NO MDIchildren 。 (只是探索一個設計理念)。
我最終的解決方案非常簡單 - 只要MdiChildActivate事件確定有一個子窗體打開,就向父窗體添加一個計時器並啓動計時器。
private void MyForm_MdiChildActivate(object sender, EventArgs e)
{
this.panel_Tools.Visible = false;
if (this.MdiChildren.Count() == 1)
{
this.timer_WindowsCounter.Start();
}
else
{
this.timer_WindowsCounter.Stop();
}
}
private void timer_WindowsCounter_Tick(object sender, EventArgs e)
{
if (this.MdiChildren.Count() == 0)
{
this.panel_Tools.Visible = true;
this.timer_WindowsCounter.Stop();
}
}
private void closeToolStripMenuItem1_Click(object sender, EventArgs e)
{
List<Form> fm = this.MdiChildren.ToList();
if(fm!=null && fm.Count>0)
{
foreach(Form lfm in fm)
{
lfm.Close();
}
}
}
由於之前的MDI子窗體實際上被關閉,因此沒有足夠的信息來檢測,如果MDI子窗體實際上是激活或關閉MdiChildActivate事件被激發,我選擇了不同的方法解決問題。
我發現ParentChanged事件在MDI子窗體關閉時觸發。
public class MdiParentForm : Form
{
// ...
private Form CreateMdiChildForm()
{
var form = new MdiChildForm
form.ParentChanged += MdiFormParentChangedHandler;
form.MdiParent = this;
return form;
}
private void MdiFormParentChangedHandler(object sender, EventArgs args)
{
var form = sender as Form;
if (form != null)
{
if (form.MdiParent != null)
{
// MDI child form will activate
// ... your code here
}
else
{
// MDI child form will close
form.ParentChanged -= MdiFormParentChangedHandler;
// ... your code here
}
}
}
// ...
}
是的,你可以很容易地檢測到添加在MDI窗體中的表單。
當由的IsMdiContainer設置爲true標記ParentForm作爲MdiContainer,所述ParentForm.ControlAdded凸起,用於將「MDICLIENT」控制到母體形式事件。因此增加MDICLIENT於母公司MDI形式,我們可以提高ControlAdded事件的MDICLIENT控制像下面,
public ParentForm()
{
InitializeComponent();
this.ControlAdded += Form1_ControlAdded;
this.IsMdiContainer = true;
我們需要提高的MDICLIENT。ControlAdded像下面,
void Form1_ControlAdded(object sender, ControlEventArgs e)
{
if(e.Control is MdiClient)
e.Control.ControlAdded += MdiClient_ControlAdded;
}
默認情況下,MDI子窗體添加到父窗體的MDICLIENT的控件集合。因此,將ChildForm.MdiParent值設置爲父窗體時,MdiClient的控件添加事件將增加。
void MdiClient_ControlAdded(object sender, ControlEventArgs e)
{
}
因此,通過使用上面的方法,你可以知道加入MDI形成父子MDI形式。像這樣,您可以爲MdiClient控件添加ControlRemoved事件,以瞭解從MDI窗體中刪除的子窗體。
希望這會幫助你。
- 1. MDI子窗體加載
- 2. Windows窗體中的MDI子窗體
- 3. MDI父窗體面板控件添加子窗體
- 4. C#窗體窗體:Mdi父窗體和子窗體問題
- 5. WinForms MDI子窗體
- 6. MDI子窗體C#
- 7. 需要打開MDI子窗體從非MDI子窗體
- 8. 我如何從子窗體發送數據到父母MDI窗體或父母MDI從C#中的子窗體?
- 9. 如何使用MDI父窗體制作mdi子窗體?
- 10. MDI子窗體不顯示
- 11. Mdi子窗體單實例
- 12. Symfony的動態添加或刪除子窗體
- 13. MDI窗體對接子窗口
- 14. 如何從另一個MDI子窗體關閉特定的MDI子窗體子窗體
- 15. 下範式創建mdi窗體,並在mdi窗體錯誤打開MDI子
- 16. MDI子窗體不允許其他子窗體獲得焦點
- 17. 在另一個MDI父窗體中的MDI父窗體
- 18. C#將MDI父窗體的值傳遞給子窗體
- 19. 如何從子窗體更新MDI父窗體中的控件?
- 20. 如何使用主MDI父窗體上的MenuList打開MDI子窗體
- 21. 想從Windows MDI子窗體中刪除圖標
- 22. 如何在MDI父窗體中激活子窗體時禁用父窗體?
- 23. 如何從MDI子窗體(MDI應用程序)打開窗體對話框
- 24. 的Windows MDI子窗體標題欄
- 25. MDI子窗體的繪畫問題
- 26. C中mdi父項中的子窗體#
- 27. MDI子窗體之間的偏移
- 28. .NET 3.5中的MDI窗體
- 29. WPF窗體+ MDI中的Winforms
- 30. 當MDI Child最大化時刪除MDI容器窗體的默認MDI菜單
我怎麼知道它是來還是去?只需檢查孩子的名單,看看發件人是否在那裏? – Malfist 2009-02-11 19:10:00
Humm,可能無法正常工作。如果我重新激活/聚焦一個打開的表單,它也會拋出該事件。 – Malfist 2009-02-11 19:11:12
我知道了,它是所有孩子的基類中的一個ID字段。 – Malfist 2009-02-11 19:14:12