2010-10-28 74 views
5

使用TabControl.SelectTab("...")顯示標籤,但它也給出標籤焦點。我想顯示一個特定的選項卡,但請保持關注位置。選擇TabControl中的標籤頁而不偷竊焦點

我在網格中有數據行。根據所選行的屬性,我顯示不同的標籤頁以擁有不同的UI佈局。但是當使用箭頭鍵滾動行時,焦點會切換到選定的選項卡 - 我不希望發生這種情況。

謝謝。

回答

3

我不認爲有一個內置的功能,但你可以這樣做:

private bool skipSelectionChanged = false; 

private void dataGridView_SelectionChanged(object sender, EventArgs e) 
{ 
    if (skipSelectionChanged) 
     return; 

    // supposing we decide tab[0] has to be selected... 
    this.SelectTabWithoutFocus(this.tabControl1.TabPages[0]); 
} 

private void SelectTabWithoutFocus(TabPage tabPage) 
{ 
    this.skipSelectionChanged = true; 

    // "this" is the form in my case, so you get the current focused control 
    // (ActiveControl), backup it, and re-set it after Tab activation 

    var prevFocusedControl = this.ActiveControl; 
    if (this.ActiveControl != null) 
    { 
     this.tabControl1.SelectedTab = tabPage; 
     prevFocusedControl.Focus(); 
    } 
    this.skipSelectionChanged = false; 
} 

在這裏,我備份當前的重點控制,選擇所需的選項卡,最後設置焦點到原來的控制。

跳過布爾值是必要的,因爲將重點放在網格上會再次觸發SelectionChanged事件,從而導致無限循環。

+0

雖然我不認爲這是一個理想的解決方案,但這個想法最終在我的應用程序中效果最佳。謝謝。 – TheSean 2011-03-10 13:25:09

+0

很高興能有所幫助:) – digEmAll 2011-03-10 14:07:22

+0

我不確定此解決方案是否可以在所有情況下都能正常工作,請參閱[此問題](http://stackoverflow.com/q/435433/806690)。 – tm1 2014-05-15 07:10:20

14

您可以嘗試在設置選定選項卡之前禁用TabControl,然後重新啓用它。這將阻止它集中注意力。我在一個帶有一些控件的選項卡控件上測試了它,並沒有看到任何視覺變化,但是您必須在UI中嘗試它,看看它是否適合您。

tabControl1.Enabled = false; 
tabControl1.SelectTab("tabPage4"); 
tabControl1.Enabled = true; 

爲了安全起見,您可以放置​​該行以重新啓用finally塊中的TabControl以確保它不會被禁用。

+0

+1真的很聰明! – digEmAll 2010-10-29 06:56:23

+0

這是個好主意,它可以正常工作,但是啓用/禁用控件的性能不是很好。原因是我的每個標籤頁都有很多控件,因此每個標籤頁都被禁用/啓用,這會花費大量時間並且在UI中看起來不太好。 – TheSean 2010-10-29 17:48:31

+0

@TheSean,我不知道是否有另一種方法來阻止它集中注意力。我認爲在用戶選擇網格中的新行不適合你後,從選項卡控件中取回焦點? – 2010-10-29 19:14:37

0

這將選擇的標籤頁,而將重點放在頂部,如要求在這裏以上:

  tc.TabPages[0].Enabled = false; 
      tc.SelectTab(0); 
      tc.TabPages[0].Enabled = true; 

TC在這裏我對的TabControl類型實例(即它是我的標籤控件,它有幾個「標籤頁」)。這適用於我。我的目的是用左右鍵(arrows)來循環瀏覽這些標籤頁。即當我往前走(由Key.Right)和到達最後tabpage我想有我專注於[0]沒有激活的DataGridView,我有在該網頁上,當我往回走(由Key.Left),達到[0]我想有[tc.TabCount - 1]已啓用,這是最後一個。對於這種情況下的代碼是:

  tc.TabPages[tc.TabCount - 1].Enabled = false; 
      tc.SelectTab(tc.TabCount - 1); 
      tc.TabPages[tc.TabCount - 1].Enabled = true; 

代碼的完整的段子:

private bool KeyTc(System.Windows.Forms.Keys keyData) 
    { 
     if (keyData == K.Left && tc.SelectedIndex == 0) 
     { 
      tc.TabPages[tc.TabCount - 1].Enabled = false; 
      tc.SelectTab(tc.TabCount - 1); 
      tc.TabPages[tc.TabCount - 1].Enabled = true; 
      return true; 
     } 
     else if (keyData == K.Right && tc.SelectedIndex == tc.TabCount - 1) 
     { 
      tc.TabPages[0].Enabled = false; 
      tc.SelectTab(0); 
      tc.TabPages[0].Enabled = true; 
      return true; 
     } 
     return false; 
    } 

這BOOL KeyTc在返回的情況下,在一個switch語句關鍵評價:

protected override bool ProcessCmdKey(ref Message keyMsg, Keys keyData) 
    { switch keyData { ... } } 
+0

這實際上不是與@adrift相同的答案嗎? – MicroVirus 2014-08-30 13:49:45

0

基於「Jeff Ogata提出的解決方案:您可以在設置選定的選項卡之前嘗試禁用TabControl,然後重新啓用它,這將阻止它獲得焦點」,這裏是bel低我的解決方案:

tabMain.SelectedPageChanging += (s, e) => 
     { 
      tabMain.Enabled = false; 
     }; 

     tabMain.SelectedPageChanged += (s, e) => 
     { 
      tabMain.Enabled = true;     
     }; 

注意:此代碼是使用DevExpress「DevExpress.XtraTab.XtraTabControl」。