2011-07-12 11 views
9

साथ पाठ बॉक्स में दबाया जाता है एक प्रयोक्ता एक खिड़कियों में दर्ज करते हैं एक KeyUp घटना के साथ पाठ बॉक्स का निर्माण करती है, खिड़कियां एक बीप या डिंग लग रहा है। मैं यह निर्धारित नहीं कर सका कि ऐसा क्यों होता है और मैं इससे कैसे बच सकता हूं।बचें विंडोज 'डिंग' जब दर्ज onkeyup

किसी भी मदद की सराहना की जाएगी।

उत्तर

7

मैं इस कल्पना का एक संयोजन के कारण होता है:

  • MultiLine = false
  • रूप

पर कोई डिफ़ॉल्ट बटन एकल लाइन आगे बक्सें क्योंकि The To कुंजी दर्ज करें डिफ़ॉल्ट बटन डिंग तब उत्पन्न होती है जब एक डिफ़ॉल्ट बटन नहीं मिल सकता है।

Private Sub myTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles myTextBox.KeyPress 
    If Asc(e.KeyChar) = 13 Then 
     e.Handled = True 
    End If 
End Sub 

यह कुंजी प्रेस, जो डिंग से बचाता है खाती है:

+0

अब मैं डिंग को समझते हैं। और मैंने इसे चेक किया। मल्टीलाइन = झूठी के साथ: अगर मैं इस बटन को फॉर्म स्वीटबटन में सेट करता हूं, तो यह तुरंत सक्रिय हो जाता है। तो कोई डिंग नहीं है, लेकिन मेरे पास कई अन्य बटन हैं और यह मेरा स्वीकार्य बटन नहीं है। यदि मैं मल्टीलाइन = सत्य सेट करता हूं तो डिंग भी चला जाता है। यही वह है जिसे मैंने प्राथमिकता दी, इसके अलावा वर्डवाप = झूठी। सहायता के लिए धन्यवाद। – ibram

1

कुछ घंटों के बाद समाधान के लिए खुदाई करने के बाद, मुझे अभी एक समाधान मिला है, लेकिन इस समस्या के लिए वास्तविक समाधान नहीं है। अब मैं KeyDown का उपयोग कर रहा हूं।

private void tbSearch_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     e.Handled = true; 
     // Call Button event 
     //btnSearch_Click(sender, EventArgs.Empty); 
     // cleaner code. Thanks to Hans. 
     btnSearch.PerformClick(); 
    } 
} 

और सभी डेवलपर्स के लिए एक उपयोगी सुझाव: अपने अनुप्रयोगों को व्हाइट म्यूट ध्वनि का परीक्षण न करें। ;-)

+1

इसके बजाय ProcessCmdKey() को ओवरराइड करें ताकि यह काम करता हो जो भी नियंत्रण पर केंद्रित हो। जब आप कुंजी पहचानते हैं तो सत्य लौटें। डिंग से बचने के लिए दर्ज करें। आप Button.PerformClick() btw का उपयोग कर सकते हैं। –

+0

बटन .PerformClick() एक अच्छा बिंदु है। मुझे यह नहीं पता था। लेकिन ProcessCmdKey मेरे काम को जटिल करेगा, क्योंकि मेरे पास बहुत सारे बटन और टेक्स्टबॉक्स हैं। मुझे हमेशा यह जांचने की ज़रूरत होगी कि प्रेषक कौन था। मैं कुछ वैश्विक कुंजी मदद के लिए बचाने, F1 के लिए F3 तरह की घटनाओं के लिए ProcessDialogKey विधि का उपयोग कर रहा हूँ ... – ibram

3

यहाँ वास्तविक जवाब है।

11

ध्वनि से छुटकारा पाने के लिए वास्तविक समाधान:

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     e.SuppressKeyPress = true; 
    } 
} 
0

ऊपर समाधान में से कोई भी मेरे लिए काम किया है ... लेकिन यहाँ मेरी सरल समाधान है!
यह तब काम करता है जब आपके ऐप में Acceptbutton की आवश्यकता नहीं होती है।

private void txtPassword_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) { cmdLogin.PerformClick(); } 
} 

private void txtPassword_Enter(object sender, EventArgs e) 
{ 
    this.Acceptbutton = this.cmdLogin; 
} 

private void txtPassword_Leave(object sender, EventArgs e) 
{ 
    this.Acceptbutton = Null; 
} 

इस तरह आप 'एंटर' दबाए जाने पर फोकस के साथ विशिष्ट टेक्स्टबॉक्स पर पिंग नहीं सुनेंगे!

0

मेरे पास इस समस्या का एक संस्करण था जो तब होगा जब मैंने एक कस्टम नियंत्रण से myDialog.ShowDialog() को कॉल किया था जब उपयोगकर्ता एक पंक्ति टेक्स्ट बॉक्स से प्रवेश करता था।

(वे एक पाठ बॉक्स में एक उत्पाद संख्या में डाला, दर्ज मारा, और संवाद पॉप और उन्हें उपलब्ध आकारों में से चुन सकते हैं। लेकिन यह रात का खाना कष्टप्रद है एक घंटी ध्वनि हर बार संवाद पॉप निभाता है।)

मैंने टेक्स्ट बॉक्स में कुंजी डाउन इवेंट फंस लिया, और e.Handled और e.SupressKeypress सेट किया, लेकिन इससे समस्या हल नहीं हुई। तब मैंने देखा कि अगर मैंने myDialog.ShowDialog() को कॉल पर टिप्पणी की, तो मुझे ध्वनि नहीं मिला, जैसा कि अजीब है। उस मामले में, ई। हैंडल और e.SupressKeypress घंटी को रोक दिया था।

मैंने सोचा कि शायद यह घटना किसी भी तरह से संवाद पर जा रही थी, इसलिए मैंने फॉर्म स्तर पर और मुख्य रूप से कीस्ट्रोक लेते हुए फॉर्म के हर तत्व पर फंस गया, और ई। हैंडल और ई। सप्रेसप्रेस उनमें से हर एक में, लेकिन यह ठीक नहीं किया।

मैंने फ़ॉर्म पर सबमिट बटन डालने और उस बटन पर फॉर्म की AcceptButton प्रॉपर्टी सेट करने का प्रयास किया, लेकिन इससे कोई मदद नहीं मिली।

मैंने myDialog.ShowDialog() को कॉल करने से पहले एप्लिकेशन.डोइवेंट्स() को कॉल करने का प्रयास किया, लेकिन इससे इसे ठीक नहीं किया गया।

मैंने देखा है कि फोन करने Application.DoEvents() घंटी यहाँ तक कि जब myDialog.ShowDialog करने के लिए कॉल() बाहर टिप्पणी की गयी है खेलने के लिए की वजह से! जैसे कि डूवेन्ट्स को कॉल करना वर्तमान घटना को ई। हैंडल और ई। सुपर्रेसकेप्रेस क्वालीफायर पर ध्यान दिए बिना संसाधित कर रहा था।

तो .. मैंने सोचा कि क्या हुआ अगर मैं वर्तमान घटना बाहर खेलने जबकि क्वालीफायर खेलने में हैं, और उसके बाद कि बाद मेरे संवाद बढ़ा?

तो मैं एक BeginInvoke अनुभाग में myDialog.ShowDialog() डाल (के बाद से मेरी धारणा है कि एक आह्वान मुख्य संदेश कतार है कि जब उस संदेश संसाधित किया जाता है विधि कहा जाता है करने के लिए कारण बनता है में एक संदेश कहते है):

 BeginInvoke((MethodInvoker)delegate { 
      SelectProduct(); // <-- pops the size selection dialog 
     }); 

विश्वास करो या नहीं, यह तय है - कोई घंटी नहीं।

(जब मैं जब एक पृष्ठभूमि धागा एक कॉलबैक कॉल दृश्य को अपडेट करने की जरूरत है मैं आमतौर पर आह्वान उपयोग करते हैं, के बाद से WinForms विचारों से खुद को मुख्य थ्रेड के अलावा किसी अन्य धागे से अद्यतन करने की अनुमति नहीं देते।)

तो मैं कस्टम नियंत्रण का अनुमान लगा रहा हूं, जहां सिंगल लाइन टेक्स्ट बॉक्स है, जहां एक स्वीकृति बटन की आवश्यकता है - लेकिन कस्टम कंट्रोल में AcceptButton प्रॉपर्टी नहीं है।

WinForms प्रोग्रामिंग एक काला कला का थोड़ा सा प्रतीत होता है। मुझे लगता है कि हर तरह के प्रोग्रामिंग की तरह, मुझे लगता है।

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