2009-07-06 14 views
15

मेरे पास WinForm पर कुछ टेक्स्टबॉक्स हैं। जब एंटर कुंजी दबाया जाता है तो मैं फोकस को अगले नियंत्रण में ले जाना चाहता हूं? जब भी कोई टेक्स्टबॉक्स नियंत्रण प्राप्त करता है, तो यह टेक्स्ट का भी चयन करेगा, ताकि कोई भी संपादन वर्तमान को प्रतिस्थापित कर सके।अगले नियंत्रण पर जाने के लिए एंटर दबाएं

ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

27

टैब के रूप में टैब: उपयोगकर्ता नियंत्रण बनाएं जो टेक्स्टबॉक्स प्राप्त करता है, KeyPress विधि को ओवरराइड करें। यदि उपयोगकर्ता एंटर दबाता है तो आप या तो SendKeys.Send("{TAB}") या System.Windows.Forms.Control.SelectNextControl() पर कॉल कर सकते हैं। ध्यान दें कि आप KeyPress ईवेंट का उपयोग करके इसे प्राप्त कर सकते हैं।

संपूर्ण टेक्स्ट पर फ़ोकस करें: फिर, ओवरराइड या ईवेंट के माध्यम से, GotFocus ईवेंट को लक्षित करें और फिर TextBox.Select विधि पर कॉल करें।

+2

की स्ट्रोक भेजा जा रहा है सबसे अच्छा समाधान नहीं है जब कार्य को पूरा करने के लिए एक विधि प्रदान की जाती है। [SelectNextControl] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.selectnextcontrol.aspx) कुंजी भेजने की गड़बड़ी के बिना टैब बटन भेजने के समान कार्य कर सकता है। – Fr33dan

2

आप अपने टेक्स्टबॉक्स पर KeyPress हैंडलर डाल सकते हैं और देख सकते हैं कि कौन सी कुंजी का उपयोग किया गया था।

टेक्स्ट चयन को संभालने के लिए, GotFocus ईवेंट पर एक हैंडलर डालें।

आप यह भी विचार करना चाहेंगे कि कैसे (या यदि आपको आवश्यकता है) बहु-पंक्ति टेक्स्टबॉक्स को संभालने के लिए।

10

एक कुंजी दबाने घटना में, यदि उपयोगकर्ता दबाया दर्ज करें, स्वचालित रूप से फोकस प्राप्त करने पर पाठ का चयन लागू करने के लिए सबसे अच्छा तरीका है फोन

SendKeys.Send("{TAB}") 

निम्नलिखित ओवरराइड के साथ अपनी परियोजना में पाठ बॉक्स के एक उपवर्ग बनाने के लिए है:

Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs) 
    SelectionStart = 0 
    SelectionLength = Text.Length 
    MyBase.OnGotFocus(e) 
End Sub 

फिर अपने सभी फॉर्मों पर WinForms मानक टेक्स्टबॉक्स के स्थान पर इस कस्टम टेक्स्टबॉक्स का उपयोग करें।

2

यह आपकी मदद कर सकते हैं:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    // 
    // Detect the KeyEventArg's key enumerated constant. 
    // 
    if (e.KeyCode == Keys.Enter) 
    { 
     MessageBox.Show("You pressed enter! Good job!"); 
    } 
} 
+0

यह एक उत्तर का केवल एक हिस्सा है ... –

20

कोड उदाहरण के एक जोड़े सी SelectNextControl का उपयोग कर # में।

दबाए जाने पर अगले नियंत्रण में पहला कदम होता है।

private void Control_KeyUp(object sender, KeyEventArgs e) 
    { 
     if((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return)) 
     { 
      this.SelectNextControl((Control)sender, true, true, true, true); 
     } 
    } 

दूसरा यूपी और नीचे तीर का उपयोग करता है नियंत्रण के माध्यम से स्थानांतरित करने के लिए।

private void Control_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(e.KeyCode == Keys.Up) 
     { 
      this.SelectNextControl((Control)sender, false, true, true, true); 
     } 
     else if(e.KeyCode == Keys.Down) 
     { 
      this.SelectNextControl((Control)sender, true, true, true, true); 
     } 
    } 

देखें MSDN SelectNextControl Method

+0

मेरा पसंदीदा जवाब। यह मानता है कि डेवलपर ने नियंत्रण के लिए टैबस्टॉप और टैबइन्डेक्स गुणों को सही ढंग से सेट किया है जो उन्हें हमेशा करना चाहिए। – user3902302

+0

यदि आप वर्तमान फॉर्म के सभी नियंत्रणों पर इसे लागू करना चाहते हैं, तो आप फॉर्म प्रॉपर्टी कीप्रेव्यू को सही पर सेट कर सकते हैं, फॉर्म की कीप इवेंट में पंजीकरण कर सकते हैं और ऊपर दिए गए कोड में "एक्टिव कंट्रोल" के साथ "(कंट्रोल) प्रेषक" को प्रतिस्थापित कर सकते हैं। –

0

आप भी इस के लिए अपने स्वयं के नियंत्रण लिख सकता है, इस स्थिति में आप अधिक बार उपयोग करना चाहते हैं। मान लें कि आप एक ग्रिड में कई बक्सें है, यह कुछ इस तरह दिखेगा: उपयोग करने के लिए

public class AdvanceOnEnterTextBox : UserControl 
{ 

    TextBox _TextBox; 
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(AdvanceOnEnterTextBox), null); 
    public static readonly DependencyProperty InputScopeProperty = DependencyProperty.Register("InputScope", typeof(InputScope), typeof(AdvanceOnEnterTextBox), null); 


    public AdvanceOnEnterTextBox() 
    { 
     _TextBox = new TextBox(); 
     _TextBox.KeyDown += customKeyDown; 
     Content = _TextBox; 

    } 


    /// <summary> 
    /// Text for the TextBox 
    /// </summary> 
    public String Text 
    { 
     get { return _TextBox.Text; } 
     set { _TextBox.Text = value; } 
    } 


    /// <summary> 
    /// Inputscope for the Custom Textbox 
    /// </summary> 
    public InputScope InputScope 
    { 
     get { return _TextBox.InputScope; } 
     set { _TextBox.InputScope = value; } 
    } 


    void customKeyDown(object sender, KeyEventArgs e) 
    { 
     if (!e.Key.Equals(Key.Enter)) return; 

     var element = ((TextBox)sender).Parent as AdvanceOnEnterTextBox; 
     if (element != null) 
     { 
      int currentElementPosition = ((Grid)element.Parent).Children.IndexOf(element); 
      try 
      { 
       // Jump to the next AdvanceOnEnterTextBox (assuming, that Labels are inbetween). 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition + 2)).Focus(); 
      } 
      catch (Exception) 
      { 
       // Close Keypad if this was the last AdvanceOnEnterTextBox 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = false; 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = true; 
      } 
     } 
    } 
} 
+0

आप निश्चित रूप से ऐसा कर सकते हैं, हालांकि, फ़ॉर्म पर एक भी विधि होने के बाद आप जिन सभी नियंत्रणों का उपयोग करने जा रहे हैं, उन्हें पुनः लिखने से कहीं अधिक आसान है, जिससे बड़े पैमाने पर कोडबेस हो सकता है, और बाद में उन्हें डिबग किया जा सकता है। – AaA

1
private void txt_invoice_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      txt_date.Focus(); 
    } 

    private void txt_date_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      txt_patientname.Focus(); 
    } 

}

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