2013-07-12 52 views
0

我有一個TabControl,其中我想要阻止添加現有的TabPage(它們由名稱標識),而將SelectedTabPage設置爲該精確的選項卡。TabControl AddingTab事件

我想知道,如果有觸發一個頁面被添加到TabControl權之前的事件。如果不是,將使用TabPages(列表)的事件CollectionChanged作爲正確的選擇嗎?

+4

一個TabControl應該永遠是你的Form類的私有變量。用戶自己不能添加任何頁面。所以通常只有你自己的代碼可以添加一個頁面。這引出了一個問題,你爲什麼要設法保護自己免受自己的代碼侵害。它不像外部代碼沒有任何其他方式來添加頁面,如果它真的想要的話。 UI自動化可以訪問選項卡控件。反射總是一個後門。停止採取強硬措施。 –

+0

我同意Hans Passant,你的要求很奇怪而且不實際。 –

+0

@Hans Passant在visual studio中,無法在項目中打開文檔的兩個實例。相反,它會調用現有的實例並將SelectedTab設置爲同一個實例。這是我正在尋找的確切行爲。 –

回答

0

我相信你正在尋找的事件是Control.ControlAdded事件:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controladded.aspx

如果還檢測什麼時候自己添加的標籤頁裏面的東西,你應該能夠過濾掉一切,但TabPage控件在事件處理程序中使用ControlEventArgs.Control屬性。

拒絕添加控件會稍微複雜一些。由於此事件似乎只有提高後控制被添加,你需要做這樣的事情:

void onControlAdded(object sender, ControlEventArgs e) { 
    var tab = e as TabPage; 

    if (tab == null) 
     return; 

    this.myTabControlObject.TabPages.Remove(tab); 
} 

應該刪除的選項卡,但它可能會延緩標籤添加過程相當。

+0

有沒有辦法阻止添加控件?我只能看到一種方式來訪問此事件添加的控件。 –

1

嘗試類似這樣的操作,我正在檢查TabControl頁面集合與正在嘗試添加的頁面具有相同名稱的頁面(如果存在)我將焦點設置爲現有實例,否則添加新頁面到TabControl。看看這樣的事情是否適合你。控制已被添加後具有與該ControlCollection

private void button1_Click(object sender, EventArgs e) 
{ 
    TabPage tp = new TabPage(); 
    tp.Name = tabPage1.Name; 
    var temp =tabControl1.Controls.Find(tp.Name,true); 
    if(temp.Length > 0) 
    { 
     tabControl1.SelectedTab = (TabPage) temp[0]; 
    } 
    else 
     tabControl1.Controls.Add(tp); 
} 

任何將最有可能被觸發。

從以上鍊接:

可以確定是否控制是通過使控制進入包含方法的集合的成員。要獲取集合中控件位置的索引值,請將該控件傳遞給IndexOf方法。可以通過調用CopyTo方法將集合複製到數組中。


如果你願意,你可以清理你的代碼中加入一個ExtensionMethodTabControl檢查現有的頁面中,將焦點或從那裏添加。

例子:

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static bool AddPage(this TabControl tc, TabPage tp) 
     { 
      var matchedPages = tc.Controls.Find(tp.Name, false); 
      if (matchedPages.Length > 0) 
      { 
       tc.SelectedTab = (TabPage)matchedPages[0]; 
       return true; 
      } 
      else 
      { 
       tc.TabPages.Add(tp); 
       tc.SelectedTab = tp; 
       return false; 
      } 

     } 
    } 
} 

用法:

tabControl1.AddPage(tp); 
+0

我以前有過類似的解決方案,但我想知道是否可以直接在集合或選項卡控件中處理它。 –

+0

@ Francis.Beauchamp看到我的編輯,因爲即使它們是物理上不同的實例,但是您處理的名稱是相同的,Find方法將起作用。據我所見,只有在添加頁面後,其他方法纔會響應。 –