2012-03-16 39 views
4

我有一個簡單的窗體,上面有一個splitviewcontainer,左側是菜單,右側包含一個或多個控件。清除後應如何在控件中停止計時器?

一個所述能在RHS被加載對照的含有一個定時器來刷新其數據每隔幾秒。

如果我在右側使用Controls.Clear(),控件不再顯示,但我認爲它還沒有被處置,因爲定時器仍然在發射(我可以看到數據庫調用是在日誌)。

我的問題是這樣的,我應該怎麼收拾我的控制時,它已經被刪除顯示?控制清除時調用哪個事件/方法?

+0

您可以覆蓋可見性及起動和停止計時器? – 2012-03-16 15:24:45

+0

或聽父母改變? – 2012-03-16 15:25:06

+0

您是否在問如何停止計時器來觸發elasped/tick事件或如何處理面板中的控件? – Steve 2012-03-16 15:25:35

回答

1

你應該叫上控制適當的Dispose()方法。

您可以使用擴展方法來做到這一點,看到漢斯帕桑特this答案。

可以在RHS上加載的控件之一包含一個定時器,每隔幾秒刷新其數據。現在

,你可以在這裏有一個競爭條件。當您撥打您尚未創建的Clear()擴展方法時,計時器可能會因回撥而失敗。如果你的定時器回調函數可能會導致應用程序中的數據損壞,你將不得不這樣做。

Timer.Stop(); 
Timer.Tick -= Timer_Tick(TimerCallback); 
Timer.Dispose(); 

現在的另一個問題是 - 您是否可以隱藏這些控件?有沒有阻止你這樣做的約束?

+0

是不是隻是隱藏控件內存泄漏問題? – KingCronus 2012-03-16 15:34:31

+0

@AdamKing:是什麼讓你得出這個結論? – 2012-03-16 15:37:28

+0

我的理解是,隱藏控制是內存,只是不顯示它。這不是這種情況嗎? – KingCronus 2012-03-16 15:38:45

1

這段代碼應該工作

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 
    } 
} 

我很樂意回答任何疑問

0

我會用一個擴展方法,而不是清除()。並通過子控件循環並專門配置它們。如果有證書控制沒有導致這種情況的IDispose(但應該有),那麼你可以在循環中明確地捕獲它們,並在以最終清除摧毀它們之前調用任何方法來阻止它們。