एंटर दबाते ही 'डिंग' बंद करें


124

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

यह सब ठीक है। हालाँकि, मेरे फॉर्म में, मेरे पास 1 टेक्स्टबॉक्स, और एक खोज बटन है। और मैं उपयोगकर्ता को टाइपिंग समाप्त करने के बाद Enter दबाकर एक खोज करने की अनुमति दे रहा हूं, इसलिए उन्हें खोज बटन पर क्लिक करने के लिए माउस का उपयोग करने की आवश्यकता नहीं है

लेकिन यह डिंग साउंड होता है। यह अत्यधिक दुखी कर रहा है।

हम इसे केवल इतना कैसे बना सकते हैं कि ध्वनि मेरे फॉर्म में बिल्कुल नहीं चलती है?

@ डेविड एच - यहाँ मैं कैसे एंटर दबाने का पता लगा रहा हूँ:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}

पाठ बॉक्स में फ़ोकस होने पर आप कैसे पता लगाते हैं कि Enter दबाया गया है?
डेविड हेफर्नन

गुण फलक में, आप KeyDown या KeyUp ईवेंट पर डबल-क्लिक करें। फिर, कोड दृश्य में, आप उस कोड को टाइप करते हैं जो मैं अपने प्रश्न में yah के लिए डालने वाला हूं।
बेंड्र

2
कुंजी दबाने शायद सही घटना है, और आप स्थापित करने के लिए e.Handled सच = चाहते हैं
डेविड हेफेरनान

धन्यवाद, @
डेविड

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

जवाबों:


56

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

डॉक्स से:

यह गुण आपको उपयोगकर्ता को आपके अनुप्रयोग में ENTER कुंजी दबाने पर होने वाली एक डिफ़ॉल्ट कार्रवाई नामित करने में सक्षम बनाता है। इस प्रॉपर्टी को दिया गया बटन एक IButtonControl होना चाहिए जो वर्तमान फॉर्म पर हो या वर्तमान फॉर्म में कंटेनर के भीतर स्थित हो।

जब उपयोगकर्ता प्रेस से बच जाता है, तो उसके लिए एक कैंसलबटन संपत्ति भी होती है ।


1
धन्यवाद @ mdm, इसने मेरे लिए सबसे अच्छा काम किया। :) जब मैं और अधिक प्रतिनिधि होगा तो मैं वापस ऊपर आऊंगा।
बेंड्र

1
@bendr में भी यही समस्या है .. लेकिन UserControl का उपयोग करके im .. इसमें Form.AcceptButton नहीं है .. इसे कैसे ठीक करें?
मुराफ सूसली

1
Visual Studio को इसके लिए गुण फलक में फ़ील्ड नहीं लगता है। यह कोड में किया जाना है, जाहिरा तौर पर। this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
क्रिस

5
यह ToolStripButtons के लिए काम नहीं करेगा या यदि आप TextBox या ToolStripTextBox को मान्य करने के लिए ENTER कुंजी का उपयोग करना चाहते हैं। बेहतर दृष्टिकोण लुसियो फोंसेका का जवाब होगा जो मेरे लिए टूलस्ट्रिपटेक्स्टबॉक्स के साथ काम करता था।
राबर्ट एस।

मैं आपका समाधान नहीं देख सकता कि आपके पास अधिक प्रबुद्ध होने के लिए एक व्यावहारिक अभ्यास नहीं है
पेड्रो

198

इससे मेरा काम बनता है:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

    //Se apertou o enter
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down

        this.doSomething();

        e.Handled = true;
        e.SuppressKeyPress = true;

     }

 }

SuppressKeyPress वास्तव में चाल है। मुझे उम्मीद है कि आपकी मदद करेंगे।


30
यह एकमात्र मान्य उत्तर है, मेरी राय में। e.Handled = true;अपर्याप्त था; यह था SuppressKeyPressकि चाल किया।
जोनाथन रेनहार्ट

12
textBox1_KeyUp संभाले या SuppressKeyPress की परवाह किए बिना इस स्थिति में मर जाएगा
stackuser83

4
मेरे साथ काम करता है ToolStripTextBox.KeyDown। कोई और उपाय नहीं किया। धन्यवाद!
राबर्ट एस।

1
यह मेरे textboxऔर KeyDownघटना पर मेरे लिए काम नहीं किया
एलेक्स Jolig

7
यह स्वीकृत उत्तर होना चाहिए। वर्तमान स्वीकृत उत्तर के लिए फॉर्म पर रखे मानक बटन की आवश्यकता होती है जो अप्रिय है।
जाविद

56

प्रयत्न

textBox.KeyPress += new KeyPressEventHandler(keypressed);

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true; //this line will do the trick
    }
}

सही है, लेकिन यह केवल तभी काम करेगा जब फोकस अभी भी टेक्स्टबॉक्स पर हो। यदि उपयोगकर्ता Tabपहले दबाता है तो क्या होगा ?
एमडीएम

4
@mdm UI डिज़ाइन पर निर्भर करता है। शायद ओपी केवल यह कार्रवाई चाहता है जब पाठ बॉक्स पर ध्यान केंद्रित किया गया हो। यह बहुत आम है।
डेविड हेफर्नन

2
यदि उपयोगकर्ता ने टैब दबाया है, तो फोकस अब टेक्स्टबॉक्स पर नहीं होगा, अगला कंटोल जो फोकस किया जाएगा वह बटन नियंत्रण है, जो उस पर एंटर करते ही वह आवाज नहीं करता है। :-)
बेंड्र

@ डेविड, आपके उदाहरण के लिए धन्यवाद। मैंने बस कोशिश की। और जब भी मैंने ई.हैंडलड = सच को .केपी ईवेंट में डाला, कोई भी अन्य कोड निष्पादित नहीं करता है। केवल एक चीज जो होती है वह है TextBox में सभी पाठ चयनित हो जाते हैं (और मेरे पास कोड भी नहीं है जो किसी भी पाठ का चयन करता है)
बेंड्र

1
लुसियो फोंसेका का जवाब केवल यही था कि मुझे समस्या का ध्यान रखना था।
जोनाथन रेनहार्ट

15

बस e.SuppressKeyPress = true;अपने "अगर" कथन में जोड़ें ।

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //If true, do not pass the key event to the underlying control.
        e.SuppressKeyPress = true;  //This will suppress the "ding" sound.*/

        // Perform search now.
    }
}

13

आप KeyUp के बजाय KeyPress का उपयोग कर सकते हैं या KeyDown को इसके अधिक कुशल और यहां बताया गया है कि इसे कैसे हैंडल किया जाए

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            e.Handled = true;
            button1.PerformClick();
        }
    }

और 'डिंग' को शांति कहना


2
इसने मेरे लिए पूरी तरह से काम किया। e.andled जाहिर तौर पर 'डिंग' को निष्क्रिय करता है। 'सबमिट' बटन बनाने से (मेरे मामले में) डिफ़ॉल्ट, मेरे लिए काम नहीं करेगा क्योंकि मैं फॉर्म के अन्य टेक्स्ट बॉक्स के लिए अलग से 'एंटर' कुंजी को संभालना चाहता था। <br/> <br/> वैसे : इस परियोजना के लिए मैं वीबी का उपयोग कर रहा हूं। इसलिए e.KeyChar को चुनने के बजाय, मैं इसे रूपांतरित करता हूं: यदि e.KeyChar = ChrW (Keys.Enter उसके बाद ...
मार्क Ainsworth

1
KeyDownउपयोग करने के भीतर , का उपयोग करना e.Handledऔर e.SuppressKeyPressमेरे लिए काम नहीं किया - अभी भी dinging। लेकिन इसे बदलने के लिए यहाँ सुझाव दिया गया है कि KeyPress' event and e.andled का उपयोग करें ।
जिनली ने

यह सही उत्तर होना चाहिए, धन्यवाद
फ़ेरस श्रौरौ

7

SuppressKeyPressइसे संभालने के बाद कीस्ट्रोक के निरंतर प्रसंस्करण को रोकने के लिए उपयोग करें ।

public class EntryForm: Form
{
   public EntryForm()
   {
   }

   private void EntryTextBox_KeyDown(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         e.Handled = true;
         e.SuppressKeyPress = true;
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
          e.Handled = true;
          e.SuppressKeyPress = true;
          // do some stuff

      }
   }

   private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
         // do some stuff

      }
   }
}

2

मैंने इस पोस्ट पर ठोकर खाई, जबकि एक कीडाउन को संभालने की कोशिश में यह मेरे लिए काम कर गया।

If e.KeyCode = Keys.Enter Then
   e.SuppressKeyPress = True
   btnLogIn.PerformClick()
End If

की प्रेस दबाने पर घटना को अंतर्निहित नियंत्रण में भेजे जाने से रोक दिया जाता है। यह काम करना चाहिए यदि आप मैन्युअल रूप से वह सब कुछ संभाल रहे हैं जो कि दर्ज करें तो वह टेक्स्टबॉक्स के भीतर हो जाएगा। Visual Basic के बारे में क्षमा करें।


2

बहुत कम मौका है कि किसी को भी इसका जवाब मिले लेकिन कुछ अन्य जवाब वाकई डरावने हैं। KeyDownएक हड़ताल में 2 अतिरिक्त घटनाओं को मारना दमनकारी घटना है । इस संदर्भ में e.Handledसंपत्ति सेट करना trueबेकार है।
सबसे अच्छा तरीका है कि Form.AcceptButtonसंपत्ति को वास्तविक खोज बटन पर सेट किया जाए । कुंजी
का उपयोग करने का एक और तरीका भी है Enter- कुछ लोग इसे TABबटन के रूप में कार्य करना चाह सकते हैं । ऐसा करने के लिए, एक नया जोड़ें Button, अपनी Locationसंपत्ति को Formक्षेत्र के बाहर सेट करें (यानी (-100, -100)) - कुछ मामलों में हैंडलर को अक्षम Visibleकरने के लिए संपत्ति सेट कर falseसकते हैं ButtonForm.AcceptButtonप्रॉपर्टी को अपने नए बटन पर सेट करें। में Clickईवेंट हैंडलर निम्नलिखित कोड जोड़ने
this.SelectNextControl(ActiveControl, true, true, true, true)

अब, आप स्थानांतरित करना चाहते हो सकता है focusकेवल जब focusउस पर TextBoxया तो परीक्षण करने के लिए आप चाहते हो सकता है ActiveControlप्रकार या उपयोग e.Supressउपयोग के लिए नहीं होती नियंत्रण के ईवेंट हैंडलर्स में संपत्ति Enterके रूप में TAB बस इतना ही। तुम भी कब्जा करने की जरूरत नहीं हैe.KeyCode


1
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

            e.Handled = true; //This will prevent the "ding" sound

            //Write the rest of your code
        }
    });

यही है जिसकी मेरे द्वारा तलाश की जा रही है।
सिड

1

WinForms पर Enter कुंजी डिंग ध्वनि का कारण बनती है क्योंकि फॉर्म गुण AcceptButton निर्दिष्ट नहीं है। अगर आपको AcceptButton की आवश्यकता नहीं है, तो KeyPreview को सत्य पर सेट करके और निम्न KeyPress घटना दर्ज करने के लिए डिंग साउंड को दबाया जा सकता है:

private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
        e.Handled = true;
}

कोई फर्क नहीं पड़ता कि क्या नियंत्रण सक्रिय है, एंटर कुंजी दबाते समय कोई अधिक डिंग ध्वनि नहीं होगी। चूँकि कुंजी ईवेंट को विफल करने का क्रम KeyDown है, KeyPress और KeyUp दर्ज करें कुंजी अभी भी नियंत्रणों के लिए KeyDown ईवेंट के लिए काम करेगी।


0

अपने खोज बटन की IsDefault गुण को इसमें सेट करें true। इससे यह एक डिफ़ॉल्ट बटन बन जाएगा और एंटर दबाए जाने पर यह ऑटो क्लिक हो जाएगा।


डॉक्स से आप जुड़ेTo specify the default button of a form, set the AcceptButton property of the form to the desired button.
mdm

हां, मैंने खुद इसकी जांच की है। ऐसा लगता है कि दोनों दृष्टिकोण विनिमेय हैं। AcceptButtonअधिक स्टाइलिश लगता है, लेकिन मैं IsDefaultखुद के लिए उपयोग किया जाता हूं।
ज्रूत

0

वैसे मैं इस समस्या के साथ बहुत पहले से रहता था और इसे यहाँ देखता था।

काफी समय तक इस बारे में सोचने के बाद और इसे ठीक करने का सबसे सरल तरीका चाहते हुए भी मैं इसे ठीक करने के लिए सबसे आसान लेकिन सुरुचिपूर्ण तरीके से नहीं आया।

मैंने जो किया था यह रहा।

  1. फॉर्म पर 2 अदृश्य बटन "ओके" और "रद्द करें" डालें।
  2. अदृश्य बटन के रूप में AcceptButton और CancelButton गुण सेट करें।
  3. बटन के लिए कोई कोड जोड़ा गया!

इस उपकरण में सूचीबद्ध सभी द्वितीयक समस्याओं को हल किया गया, जिसमें ToolStripMenu शामिल है। मेरी सबसे बड़ी शिकायत थी बाइंडिंगविगेटर, जब मैं वर्तमान स्थिति में एक रिकॉर्ड संख्या दर्ज करने के लिए नेविगेट करने और दबाने के लिए प्रवेश करूंगा।

मूल प्रश्न के अनुसार जिसमें प्रोग्रामर एक खोज फ़ंक्शन चाहता था जब एंटर बटन दबाया गया था, मैंने बस खोज कोड को इनवॉइस ओके बटन में डाला था!

अब तक यह सभी समस्याओं को हल करने के लिए लगता है, लेकिन जैसा कि हम सभी विजुअल स्टूडियो के साथ जानते हैं, शायद कुछ फसल होगी।

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


0

आप अपने टेक्स्टबॉक्स को बहु-पंक्ति में सच में सेट कर सकते हैं फिर Enter कुंजी दबाएं।

private void yourForm_Load(object sender, EventArgs e)
    {
        textBox1.Multiline = true;
    }

//then write your TextBox codes
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // doSomething();
    }
}

0

मैंने एक मल्टीलाइन टेक्स्टबॉक्स के लिए टेक्स्टबॉक्स के गुणों को बदल दिया है और यह मेरे लिए काम करता है।


उत्तर पहले से ही 22-फेब पर नीचे बताया गया था। ); तुम भी की [दर्ज] देखभाल करने के लिए है
आकर्षण आते हैं

-2
void RTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == Keys.Enter)
    {
        //do ...
        bool temp = Multiline;
        Multiline = true;
        e.Handled = true;
        Multiline = temp;
    }
}

1
यह केवल कोड के साथ एक अनावश्यक उत्तर है, कोई स्पष्टीकरण नहीं। साथ ही, सभी Multilineकोड पूरी तरह से अप्रासंगिक हैं।
जोनाथन रेनहार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.