2011-08-31 1088 views
2

我在WinForm內部使用UserControl來顯示數據。 我還使用命令模式,以便UserControl註冊(弱)事件,並在命令觸發時執行其他操作。如何知道何時不再使用UserControl(無關閉事件)

WinForm我可以取消註冊Close事件中的事件。但UserControl上沒有這種事件。 我連接了當UserControl不再在顯示堆棧中時我認爲會被觸發的事件,但是沒有任何用處。 要通過我檢查Parent是否爲空,並且適用於大多數情況。

現在,我想有個孩子的另一個UserControlUserControl(把TabControlUserControl)和Parent屬性不會是空的子控件不再當不再顯示父。

有什麼方法可以知道UserControl是否被使用?

我到目前爲止所嘗試的:Dispose()不會被系統直接調用,所以它沒有用;系統也不會更新IsVisible;沒有發生CloseUnload事件。

乾杯。

回答

1

它確實是Dispose()方法。如果它沒有足夠早地調用,那麼在使用該控件的代碼中存在一個錯誤。例如使用Controls.Clear()或Controls.Remove()。

控件的父控件始終迭代其控件集合,並在子控件處置時處置它。這使得處理自動化,從表單的Dispose()開始,在表單關閉時運行。但是,如果您自行刪除控件,則會自動執行而不是

+0

我正在自己添加和刪除UserControl。沒有Disposed事件,並且Dispose方法已經在設計器代碼中被覆蓋,所以我沒有把我自己的代碼放在那裏。 – R4cOON

+4

從Designer.cs文件中將Dispose方法重寫剪切並粘貼到代碼文件中。在設計器文件的少數有效編輯之一中,它是標記爲「組件設計器生成代碼」的區域之前的*。 –

+0

我不知道把Dispose()方法放在主類文件中是可以接受的。那看起來是正確的方式。它不能解決我的問題,在選項卡中的2個控件,並檢查當前的控件是否活動,但我想我必須自己編碼。 – R4cOON

3

Control上有一個HandleDestroyed事件可能適用於您。

+0

是的,但要小心。見[這個問題](http://stackoverflow.com/questions/8657862/handledestroyed-event-in-usercontrol)。 – pelesl

0

在過去,我通過獲取父窗體(使用Control.ParentForm)並直接連接到FormClosing事件來處理此問題。

棘手的部分是知道何時調用ParentForm。用戶控件首次創建時未設置。有時我重寫OnLayout處理程序並監視,直到ParentForm不爲null。

相關問題