2010-10-28 7 views
5

TabControl.SelectTab("...") का उपयोग टैब दिखाता है लेकिन यह टैब फोकस भी देता है। मैं एक विशेष टैब दिखाना चाहता हूं, लेकिन ध्यान केंद्रित करें जहां यह है।फोकस चोरी किए बिना टैबकंट्रोल में टैब पेज का चयन करें

मेरे पास ग्रिड में डेटा पंक्तियां हैं। चयनित पंक्ति के गुणों के आधार पर, मैं एक अलग यूआई लेआउट रखने के लिए एक अलग टैब पेज दिखाता हूं। लेकिन पंक्तियों के माध्यम से स्क्रॉल करने के लिए तीर कुंजियों का उपयोग करते समय, फोकस चयनित टैब पर स्विच करता है - जो मैं नहीं करना चाहता।

धन्यवाद।

उत्तर

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

+0

मदद की खुशी है :) – digEmAll

+0

मुझे यकीन नहीं है कि यह समाधान सभी मामलों में काम करेगा या नहीं, [यह सवाल] देखें (http://stackoverflow.com/q/435433/806690)। – tm1

14

आप चयनित टैब सेट करने से पहले TabControl को अक्षम करने का प्रयास कर सकते हैं, फिर इसे पुनः सक्षम कर सकते हैं। यह इसे ध्यान केंद्रित करने से रोक देगा। मैंने इस पर कुछ नियंत्रणों के साथ एक टैब नियंत्रण पर इसका परीक्षण किया, और कोई दृश्य परिवर्तन नहीं देखा, लेकिन आपको इसे अपने यूआई में आज़माकर देखना होगा कि यह आपके लिए ठीक है या नहीं।

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

सुरक्षा के लिए, आप अंततः यकीन है कि यह विकलांग नहीं छोड़ दिया हो जाता है बनाने के लिए ब्लॉक एक में TabControl पुन: सक्षम करने के लिए लाइन डाल सकता है।

+0

+1 वास्तव में स्मार्ट! – digEmAll

+0

यह एक अच्छा विचार है और यह सही तरीके से काम करता है, लेकिन प्रदर्शन को सक्षम/अक्षम करने के लिए प्रदर्शन बहुत अच्छा नहीं है। कारण यह है कि मेरे प्रत्येक टैब पेज में बहुत सारे नियंत्रण हैं, इसलिए प्रत्येक एक अक्षम/सक्षम है, जिसमें बहुत समय लगता है और यूआई में अच्छा नहीं दिखता है। – TheSean

+0

@TheSean, मुझे नहीं पता कि फोकस लेने से रोकने का कोई और तरीका है या नहीं। मैं इसे लेता हूं कि उपयोगकर्ता ग्रिड में एक नई पंक्ति का चयन करने के बाद टैब नियंत्रण से वापस ध्यान केंद्रित कर रहा है, यह आपके लिए काम नहीं करता है? –

0

यह टैब पृष्ठों जबकि शीर्ष पर ध्यान केंद्रित रखने के रूप में ऊपर यहाँ पूछा चयन करता है,:

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

टीसी यहाँ TabControl प्रकार के लिए मेरी उदाहरण है (यानी यह मेरी टैब नियंत्रण है, और यह है कुछ "टैब पेज")। यह मेरे लिए ठीक से काम करता है। मेरा उद्देश्य इन टैब पृष्ठों के माध्यम से बाएं और दाएं कुंजी (arrows) i के माध्यम से लूप करना है I ई। जब मैं आगे जाने के (Key.Right द्वारा) और DataGridView जो मुझे लगता है कि पेज में है, और सक्रिय किए बिना तक पहुँचने पिछले tabpage मैं [0] पर अपना ध्यान केंद्रित करना चाहते हैं जब मैं पीछे की ओर जाना (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 में महत्वपूर्ण मूल्यांकन के लिए एक स्विच बयान में एक मामले में लौट आता है:

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

के लिए भी काम करता है क्या यह संक्षेप में @adrift के समान उत्तर नहीं है? – MicroVirus

0

"जेफ ओगाटा द्वारा प्रस्तावित समाधान पर आधार: आप चयनित टैब को सेट करने से पहले टैबकंट्रोल को अक्षम करने का प्रयास कर सकते हैं, फिर इसे पुनः सक्षम कर सकते हैं। इससे इसे फोकस करने से रोका जा सकता है", यहां बेल कम मेरी समाधान:

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

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

नोट: इस कोड DevExpress "DevExpress.XtraTab.XtraTabControl" उपयोग कर रहा है।

संबंधित मुद्दे