2010-10-28 33 views
5

Sử dụng TabControl.SelectTab("...") hiển thị tab nhưng nó cũng cho tiêu điểm tab. Tôi muốn hiển thị một tab cụ thể, nhưng hãy tập trung vào vị trí của nó.Chọn Trang tab trong TabControl mà không lấy cắp tiêu điểm

Tôi có các hàng dữ liệu trong lưới. Dựa trên các thuộc tính của hàng đã chọn, tôi hiển thị một trang tab khác nhau để có bố cục giao diện người dùng khác nhau. Nhưng khi sử dụng các phím mũi tên để cuộn qua các hàng, tiêu điểm sẽ chuyển sang tab đã chọn - mà tôi không muốn xảy ra.

Cảm ơn.

Trả lời

3

Tôi không nghĩ rằng có một chức năng built-in, nhưng bạn có thể làm theo cách này:

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

Ở đây, tôi sao lưu sự kiểm soát tập trung hiện tại, chọn tab mong muốn, và cuối cùng đặt tiêu điểm để kiểm soát ban đầu.

Bỏ qua boolean là cần thiết, vì việc tập trung vào lưới bạn kích hoạt lại sự kiện SelectionChanged, gây ra vòng lặp vô hạn.

+0

Mặc dù tôi không nghĩ đây là giải pháp lý tưởng, ý tưởng này đã kết thúc hoạt động tốt nhất trong ứng dụng của tôi. Cảm ơn. – TheSean

+0

Vui mừng được giúp đỡ :) – digEmAll

+0

Tôi không chắc liệu giải pháp này có hoạt động trong mọi trường hợp hay không, xem [câu hỏi này] (http://stackoverflow.com/q/435433/806690). – tm1

14

Bạn có thể thử tắt TabControl trước khi đặt tab đã chọn, sau đó bật lại. Điều này sẽ ngăn không cho nó lấy nét. Tôi đã thử nghiệm điều này trên một tab điều khiển với một vài điều khiển trên nó, và không thấy bất kỳ thay đổi trực quan, nhưng bạn sẽ phải thử nó trong giao diện người dùng của bạn và xem liệu nó là ok cho bạn.

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

Để an toàn, bạn có thể đặt dòng để kích hoạt lại TabControl trong một khối cuối cùng để đảm bảo nó không bị vô hiệu hóa.

+0

+1 Thực sự thông minh! – digEmAll

+0

Đây là ý tưởng hay và nó hoạt động chính xác, nhưng hiệu suất không phải là rất tốt để kích hoạt/vô hiệu hóa điều khiển. Lý do là mỗi trang tab của tôi có nhiều điều khiển, vì vậy mỗi trang bị vô hiệu hóa/bật, mất rất nhiều thời gian và trông không đẹp trong giao diện người dùng. – TheSean

+0

@ TheSean, tôi không biết liệu có cách nào khác để ngăn không cho nó tập trung. Tôi lấy nó mà lấy trọng tâm trở lại từ kiểm soát tab sau khi người dùng chọn một hàng mới trong lưới điện không làm việc cho bạn? –

0

này sẽ chọn các trang tab trong khi vẫn giữ sự tập trung trên đầu, như hỏi ở đây trên:

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

tc là ở đây ví dụ của tôi cho TabControl loại (tức là nó là kiểm soát tab của tôi, và nó có một vài "trang tab"). Điều này làm việc đúng cho tôi. Mục đích của tôi là lặp qua các trang tab này bằng các phím Trái và Phải (arrows) i. e. khi tôi đi tới (Key.Right) và đạt đến số tabpage cuối cùng tôi muốn tập trung vào [0] mà không kích hoạt DataGridView mà tôi có trong trang đó và khi tôi quay lại (bằng Key.Left) và đạt đến [0] Tôi muốn có [tc.TabCount - 1] được bật, đây là phiên bản cuối cùng. Mã cho trường hợp này là:

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

các mảnh đầy đủ các mã là:

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

này bool KeyTc được trả lại cho một trường hợp trong một câu lệnh switch để đánh giá quan trọng trong việc:

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

Đây không phải là câu trả lời giống như @adrift? – MicroVirus

0

Dựa trên giải pháp được đề xuất bởi "Jeff Ogata: Bạn có thể thử tắt TabControl trước khi đặt tab đã chọn, sau đó bật lại. Điều này sẽ ngăn không cho nó tập trung", tại đây bel giải pháp của tôi thấp:

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

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

Lưu ý: mã này đang sử dụng DevExpress "DevExpress.XtraTab.XtraTabControl".

Các vấn đề liên quan