我有一個簡單的窗體,上面有一個splitviewcontainer,左側是菜單,右側包含一個或多個控件。清除後應如何在控件中停止計時器?
一個所述能在RHS被加載對照的含有一個定時器來刷新其數據每隔幾秒。
如果我在右側使用Controls.Clear(),控件不再顯示,但我認爲它還沒有被處置,因爲定時器仍然在發射(我可以看到數據庫調用是在日誌)。
我的問題是這樣的,我應該怎麼收拾我的控制時,它已經被刪除顯示?控制清除時調用哪個事件/方法?
我有一個簡單的窗體,上面有一個splitviewcontainer,左側是菜單,右側包含一個或多個控件。清除後應如何在控件中停止計時器?
一個所述能在RHS被加載對照的含有一個定時器來刷新其數據每隔幾秒。
如果我在右側使用Controls.Clear(),控件不再顯示,但我認爲它還沒有被處置,因爲定時器仍然在發射(我可以看到數據庫調用是在日誌)。
我的問題是這樣的,我應該怎麼收拾我的控制時,它已經被刪除顯示?控制清除時調用哪個事件/方法?
你應該叫上控制適當的Dispose()
方法。
您可以使用擴展方法來做到這一點,看到漢斯帕桑特this答案。
可以在RHS上加載的控件之一包含一個定時器,每隔幾秒刷新其數據。現在
,你可以在這裏有一個競爭條件。當您撥打您尚未創建的Clear()
擴展方法時,計時器可能會因回撥而失敗。如果你的定時器回調函數可能會導致應用程序中的數據損壞,你將不得不這樣做。
Timer.Stop();
Timer.Tick -= Timer_Tick(TimerCallback);
Timer.Dispose();
現在的另一個問題是 - 您是否可以隱藏這些控件?有沒有阻止你這樣做的約束?
是不是隻是隱藏控件內存泄漏問題? – KingCronus 2012-03-16 15:34:31
@AdamKing:是什麼讓你得出這個結論? – 2012-03-16 15:37:28
我的理解是,隱藏控制是內存,只是不顯示它。這不是這種情況嗎? – KingCronus 2012-03-16 15:38:45
這段代碼應該工作
public Form1()
{
InitializeComponent();
UserControl cc = new UserControl();
Panel pp = new Panel();
pp.Controls.Add(cc);
pp.ControlRemoved += new ControlEventHandler(pp_ControlRemoved);
pp.Controls.Clear();
}
void pp_ControlRemoved(object sender, ControlEventArgs e)
{
var control = sender as MyVerySpecialControl;
if (control != null)
{
//stop timers or unassign events
}
}
我很樂意回答任何疑問
我會用一個擴展方法,而不是清除()。並通過子控件循環並專門配置它們。如果有證書控制沒有導致這種情況的IDispose(但應該有),那麼你可以在循環中明確地捕獲它們,並在以最終清除摧毀它們之前調用任何方法來阻止它們。
您可以覆蓋可見性及起動和停止計時器? – 2012-03-16 15:24:45
或聽父母改變? – 2012-03-16 15:25:06
您是否在問如何停止計時器來觸發elasped/tick事件或如何處理面板中的控件? – Steve 2012-03-16 15:25:35