2012-08-10 4 views
5

दृश्य स्टूडियो 2010, सी #कैसे

टैब करके फोकस प्राप्त करने के लिए समय में एक WinForm बटन को सक्षम करने के लिए मैं एक DropDown साथ SuggestAppend को AutoComplete सेट एक ComboBox है, और AutoCompleteSourceListItems से है। जब तक सही प्रविष्टि न हो तब उपयोगकर्ता कुंजी उसमें डेटा डालती है। डेटा को सूची आइटमों में से किसी एक से मिलान करें, कम्बोबॉक्स के बगल में एक बटन अक्षम है।

यदि उपयोगकर्ता टैब कुंजी को हिट करता है तो स्वत: पूर्ण सुविधा वर्तमान सुझाव स्वीकार करती है। यह सक्षम होने वाले टैब अनुक्रम में अगले नियंत्रण पर भी चलता है। बेशक, क्योंकि मैं इसे अक्षम बटन पर जाना चाहता हूं, जैसे ही मैं प्रवेश को मान्य करता हूं, इसे सक्षम करने की आवश्यकता होती है।

समस्या यह है कि मैंने कोशिश की है कि कोई भी घटना, PreviewKeyDown, LostFocus, SelectedIndexChanged मुझे इसे प्राप्त करने और फोकस प्राप्त करने के लिए बटन को सक्षम करने की अनुमति देता है। यह हमेशा टैब ऑर्डर में अगले बटन पर जाता है जो हमेशा सक्षम होता है।

मैं बटन सक्षम करने के लिए तैयार हूं और जल्द ही दबाए जाने पर यह त्रुटि देता है लेकिन मैं इसे इस तरह से नहीं करना चाहता हूं। इन नियंत्रणों को ध्यान में रखते समय ट्रैक रखने के लिए मैं विशेष मोड झंडे नहीं लेना चाहता हूं। प्रमाणीकरण एक सामान्य बात प्रतीत होता है, लेकिन मैं अटक गया हूँ।

यदि SelectedIndexChanged काम करता है तो उपयोगकर्ता ने एक मैच बनाया, यह आसान होगा। जब बॉक्स साफ़ हो जाता है और न ही टाइप किए गए मैच को मिलता है तो यह आग नहीं होता है।

+0

टेक्स्ट चेंज किए गए ईवेंट का उपयोग करें। –

उत्तर

0
try this : 

key_press घटना:

if (e.KeyData == Keys.Enter) 
     { 
      button2.Enabled = true; 
      button2.Focus(); 
     } 
+0

यह टैब कुंजी पर कार्य नहीं करता है। इसके अलावा KeyPress ईवेंट KeyData की आपूर्ति नहीं करता है। –

0
घटना hanlders आप उल्लेख किया है, (LostFocus, SelectedIndexChanged और PreviewKeyDown) के बजाय

अपने बता गया की "पुष्टि" घटना का उपयोग बटन के सक्षम राज्य स्थापित करने के लिए।

आपको फ़ोकस को उस पर जाने के लिए मजबूर करने के लिए बटन पर मैन्युअल रूप से फ़ोकस करने की आवश्यकता हो सकती है।

उदा

private void comboBox1_Validated(object sender, EventArgs e) 
    { 
     button1.Enabled = true; 
     button1.Focus(); 
    } 
+1

सत्यापन में फोकस को असाइन करना बहुत अधिक लगता है। Asumming यह वहाँ रहेगा, क्या होगा यदि उपयोगकर्ता फॉर्म पर एक और बटन क्लिक किया? यह मदद में भी चेतावनी दी गई है। अहाज़ाह को मेरी टिप्पणी देखें। –

+0

यह एक उचित कॉल है। मैंने गलत तरीके से गलत समझा कि "मैं इसे अक्षम बटन पर जाना चाहता हूं"।पुनः पढ़ने के बाद, यह स्पष्ट है कि आपका मतलब है, यदि आप टैब कुंजी हिट करते हैं तो आप उस व्यवहार को चाहते हैं। –

1

आप इस व्यवहार को संपुटित करने के लिए अपने स्वयं के ComboBox वर्ग बना सकते हैं। कुछ इस तरह:

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      this.myComboBox1.TheButton = this.button1; 

      this.myComboBox1.Items.AddRange(new string[] { 
       "Monday", 
       "Tuesday", 
       "Wednesday", 
       "Thursday", 
       "Friday", 
       "Saturday", 
       "Sunday" 
      }); 

      button1.Enabled = false; 
     } 
    } 

    public class MyComboBox : ComboBox 
    { 
     public Control TheButton { get; set; } 

     public MyComboBox() 
     { 
     } 

     bool IsValidItemSelected 
     { 
      get { return null != this.SelectedItem; } 
     } 

     protected override void OnValidated(EventArgs e) 
     { 
      if (null != TheButton) 
      { 
       TheButton.Enabled = this.IsValidItemSelected; 
       TheButton.Focus(); 
      } 

      base.OnValidated(e); 
     } 

     protected override void OnTextChanged(EventArgs e) 
     { 
      if (null != TheButton) 
      { 
       TheButton.Enabled = this.IsValidItemSelected; 
      } 

      base.OnTextChanged(e); 
     } 
    } 
} 
+0

इसे बनाने के लिए समय निकालने के लिए धन्यवाद। एक समस्या यह है कि बटन फोकस ऑनवालिडेटेड इवेंट में सेट किया जा रहा है। वीएस -2010 सहायता कहता है "एंटर, गॉटफोकस, अवकाश, लॉस्टफोकस, सत्यापन, या मान्य ईवेंट हैंडलर के भीतर से फ़ोकस सेट करने का प्रयास न करें। ऐसा करने से आपका एप्लिकेशन या ऑपरेटिंग सिस्टम प्रत्युत्तर देना बंद कर सकता है।" दूसरी बात यह है कि अवकाश घटनाएं अवकाश घटना के बाद होती हैं जो बहुत देर हो चुकी है, इसलिए ऐसा नहीं लगता कि मैं वही कर सकता हूं जो मैं मूल रूप से चाहता हूं। –

+0

"तो ऐसा नहीं लगता है कि मैं जो चाहता हूं वह कर सकता हूं।" मेरे द्वारा किए गए परीक्षण एप्लिकेशन को आप जो चाहते हैं वह करता है। क्या तुमने कोशिश की? – ahazzah

+0

नहीं, मैंने नहीं किया क्योंकि सावधानी बहुत विशिष्ट लगती थी। यह वास्तव में कारगर है। थोड़ी अधिक tweeking के साथ यह उपयोगकर्ता बटन टाइप करने के तुरंत बाद बटन सक्षम करेगा। मेरे पास ProcessCmdKey के एक फॉर्म ओवरराइड का उपयोग करके एक और समाधान है जो चेतावनी का उल्लंघन नहीं करता है। मैं शायद शाब्दिक से अधिक हो रहा हूं लेकिन मैं नया हूं। पिछले 15 वर्षों में डेल्फी के साथ Win32 कर काम करने के बाद नेट और पर्याप्त मतभेद हैं जो मैं सतर्क हूं। –

0
अन्य उत्तर पर कुछ विचार के साथ

यहाँ मैं एक आंशिक senario कि स्वत: पूर्ण का उपयोग किए बिना काम करता है के साथ आया था। एक दुष्प्रभाव यह है कि पूर्वावलोकनकिडाउन घटना को दूसरी बार कहा जाता है और इसलिए सत्यापन को दो बार बुलाया जाता है। मुझे आश्चर्य है कि क्यों ... शायद मुझे एक और सवाल पूछना चाहिए।

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { 
     if (e.KeyData == Keys.Tab) { 
     if (ValidationRoutine()) { 
      e.IsInputKey = true; //If Validated, signals KeyDown to examine this key 
     } //Side effect - This event is called twice when IsInputKey is set to true 
     }   
    } 

    private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.KeyData == Keys.Tab) { 
      e.SuppressKeyPress = true; //Stops further processing of the TAB key 
      btnEdit.Enabled = true; 
      btnEdit.Focus(); 
     } 
    } 

एक बार जब आप किसी भी None के अलावा अन्य स्थापित करने के साथ AutoCompleteMode चालू करते हैं, KeyDown घटना Tab अब और कुंजी चुपचाप खाया जाता है के लिए आग नहीं करता है।