2010-09-21 15 views
8

मेरे पास AcceptButton प्रॉपर्टी पर लगाए गए बटन के साथ एक फॉर्म है ताकि तर्क होता है और जब उपयोगकर्ता रिटर्न कुंजी दबाता है तो फॉर्म बंद हो जाता है।WinForm AcceptButton हैंडलिंग रिटर्न कुंजी

उस रूप में मैं एक गतिशील रूप से निर्मित TextBox प्रदर्शित करता हूं जो तब प्रकट होता है जब उपयोगकर्ता किसी निश्चित क्षेत्र को डबल-क्लिक करता है, तब उपयोगकर्ता वापस लौटने पर छिपाता है।

जब उपयोगकर्ता TextBox पर ध्यान केंद्रित करता है तो मैं प्रेस प्रेस को प्रसंस्करण से कैसे रोकूं?

मैं कहना है कुंजी दबाएँ KeyEventArgs.Handled के माध्यम से TextBox.KeyDown ईवेंट हैंडलर में संचालित किया गया, लेकिन मेरी स्वीकार बटन के Button.Click घटना पहले सक्रिय किया जा रहा है प्रयास किया गया था ...

उत्तर

10

उपयोग TextBox की Enter और Leave घटनाओं के लिए AcceptButton संपत्ति null पर सेट करें (Enter पर) और इसे बटन को फिर से असाइन करें (Leave पर)।

+2

यह किसी व्यक्ति को इंगित करने के बाद यह स्पष्ट है! :) –

+1

यह प्रभावी रूप से स्पष्ट है लेकिन हम हमेशा ऐसी परिस्थिति में रहते हैं जहां हमें यकीन नहीं है कि यह कामकाज करने की बात है या नहीं। – Samuel

+0

@ सैमुएल: चूंकि आपने अपनी [उत्तर] (http://stackoverflow.com/a/15108697/968531) पोस्ट करने के बाद अपनी टिप्पणी पोस्ट की है: यह आईएमएचओ * * काम करने की बात नहीं है, क्योंकि कोई कामकाज नहीं है। IMHO यह * * करने का तरीका है, लेकिन * * * रास्ता ^^ – NobodysNightmare

4

शून्य जब आप उस पाठ बॉक्स बनाने के लिए, और इसे वापस सेट सामान्य मूल्य जब यह ध्यान केंद्रित खो देता है AcceptButton संपत्ति सेट करें:

var myTextBox = new TextBox ... ; 
AcceptButton = null; 

myTextBox.Leave += (s, e) => { AcceptButton = btnOK; }; 
11

फार्म AcceptButton को रीसेट जबकि जबकि पाठ बॉक्स फोकस काम करेंगे है, मैं मान लें कि टेक्स्टबॉक्स AcceptsReturn संपत्ति का उपयोग करने के लिए अधिक उपयुक्त समाधान है।

आप

myTextBox.AcceptsReturn = true; 

सेट करते हैं पर्चा वापसी दबाने पर स्वीकार नहीं करेंगे, लेकिन अपने पाठ बॉक्स यह अपने आप को संभाल कर सकते हैं।

यह आपके कोड में एकाधिक स्थानों में AcceptButton को रीसेट करने की आवश्यकता से बच जाएगा।

+2

इतना बेहतर और सुरुचिपूर्ण समाधान, +1! –

+0

यह समाधान केवल तभी काम करेगा जब टेक्स्टबॉक्स की 'मल्टीलाइन' संपत्ति सत्य है। – fusi

1

एक पूर्ण कामकाजी उदाहरण प्राप्त करने के लिए, टेक्स्टबॉक्स के AcceptReturn = true का उपयोग NobodysNightmare suggested के रूप में करें और फ़ॉर्म को ईवेंट को बबल से बचने के लिए SuppressKeyPress को सही पर सेट करें। AcceptButton का उपयोग करने के लिए आपको teceptbox को Fredrik Mörk suggested के रूप में दर्ज/छोड़ने पर AcceptButton प्रॉपर्टी को सेट/रीसेट करने की आवश्यकता है।

var tb = new TextBox ...; 
IButtonControl _oldAcceptButton = null; 
tb.AcceptReturn=true; 
tb.KeyDown += (s,e) => { 
    if(e.KeyCode==Keys.Enter) { 
    e.Handled=true; 
    //will not inform any parent controls about the event. 
    e.SuppressKeyPress=true; 

    //do your own logic 
    .... 
    } 
}; 
tb.Enter+=(s,e)=> { 
    _oldAcceptButton = AcceptButton; 
    AcceptButton = null; 
}; 
tb.Leave+=(s,e)=>{ 
    AcceptButton = _oldAcceptButton; 
}; 
संबंधित मुद्दे