2013-02-05 46 views
1

是否有標籤控件,或者也可以是自定義的,我可以開發一個預定義的事件,這將讓我上,我從選項卡控件的控件集合中刪除控制執行一些邏輯,它實際上被刪除之前從選項卡控制。標籤控件事件

上下文:

我有一個帶有標籤頁的標籤控件。這些標籤頁加載與參考網格中的條目相關的文檔。每次我在參考網格中選擇一行時,加載相應文檔的選項卡頁面都會添加到我的選項卡控件中。網格中該行的檢查列也會被檢查。

我希望能夠在我的標籤控件來關閉標籤頁,並能夠這個封閉標籤頁涉及到參考網格其對應的條目,所以我可以取消該行。

我已經通過了標籤上的全部可能的事件,試圖瀏覽並沒有發現合適的。 ControlRemoved事件僅在我的標籤頁已關閉並且標籤焦點已自動切換到下一個標籤....之後觸發。這導致我的控制移除邏輯失敗,並進入一個無限循環,試圖關閉所有可用標籤,而不僅僅是此標籤,並在關閉最後一個時拋出一個無效的索引異常。

+0

什麼UI庫您使用?的WinForms? WPF? ASP.NET?還有別的嗎? – svick

回答

0

你需要確保當您在網格取消的項目編程,你不更新標籤控件。否則,你總是會遇到無限循環,導致不需要的行爲。

您可以通過使用布爾標誌來實現此目的。在下面的代碼示例中,我沒有使用「真實」事件處理程序,因爲我目前沒有IDE來測試此操作,而是用簡單方法替換它們,因此可以這樣做:

private bool suppressTabUpdate = false; 

private void HandleGridCheckedOrUncheckedEvent() 
{ 
    if (suppressTabUpdate) 
     return; 
    // Insert logic here to create or remove the tab pages as required 
} 

private void HandleTabPageRemovedEvent() 
{ 
    suppressTabUpdate = true; 
    // Uncheck the item in the grid here 
    suppressTabUpdate = false; 
} 
+0

儘管我100%都同意這樣做,但我100%承認自己已經多次寫過這樣的代碼,但我覺得這段代碼很難維護。對於一個簡單的應用程序來說,這沒什麼大不了的(只是有點難以遵循 - 太多的狀態!),一旦你有另一個小部件,另一個行爲或對錶單行爲的任何其他改變,你可能會後悔。 – Eilon

0

我不確定是否有確切的事件可供您查找,但我有另一種方法來提出。

這聽起來對我說了一些UI代碼過於緊密地捆綁在一起。網格和標籤控件不應該直接從事件處理程序中彼此對話:這就是導致無限循環的原因(事件是來回「ping-ponging」)。相反,我建議網格和選項卡控件由另一個「組件」(只是一個類或現有表單類中的一些方法)管理,並且此組件管理打開/關閉選項卡並修改行在網格中。

例如,當用戶在網格中選擇一行時,請不要直接修改網格:相反,調用一個新方法可以在選中某行時執行任何需要的操作:選中一個複選框,打開選項卡等。當不再需要選擇行時,請不要直接更改任何選擇:相反,請調用一個新方法,該方法可以在未選中某行時執行任何需要的操作:取消選中複選框,關閉選項卡,等

0

如果你以前被刪除需要您標籤的參考,有一個簡單的方法來做到這一點。使CustomTabControl從TabControl繼承並覆蓋其OnControlRemoved事件。

如果你有這樣的:

public class CTabControl:TabControl 
    { 
     protected override void OnControlRemoved(ControlEventArgs e) 
     { 
      TabPage tp = e.Control as TabPage; // reference to tab page before it gets removed 
      base.OnControlRemoved(e);// gets removed here 
     } 
    }