Enter tuşuna basıldığında 'Ding'i durdurun


124

Çok basit bir Windows Forms Uygulamam var. Ve Windows'ta (veya en azından Windows Forms Uygulamalarında), Tek Satırlı Metin Kutusu Denetimi içindeyken Enter tuşuna bastığınızda, bir Ding. Tek satırlık bir TextBox olduğu için satırsonu giremeyeceğinizi belirten hoş olmayan bir sestir.

Her şey yolunda. Ancak, Formumda 1 Metin Kutum ve bir Arama Düğmem var. Ve kullanıcı yazmayı tamamlamadan sonra onlar kalmamak, Enter'a basarak bir arama gerçekleştirin izin am var Arama Düğmesi tıklayın için fareyi kullanmak.

Ancak bu Ding sesi ortaya çıkar. Bu çok rahatsız edici.

Sesin Formumda hiç çalmaması için nasıl yapabiliriz?

@David H - Enter tuşuna basarak şu şekilde tespit ediyorum:

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

Odak metin kutusundayken Enter tuşuna basıldığını nasıl anlarsınız?
David Heffernan

Özellikler Bölmesinde, KeyDown veya KeyUp Olayını çift tıklatırsınız. Ardından, Kod Görünümü'nde, yah için soruma koymak üzere olduğum kodu yazarsınız.
bendr

2
KeyPress muhtemelen doğru olaydır ve e.Handled = true
David Heffernan

Teşekkür ederim, @David, bunu bilmiyordum :)
bendr

7
Keşke can sıkıcı şeyi bastırmanın bir yolu olsaydı, ama tuşa basmanın kabarmasına izin verdim. Bazen bir tuşa basmak sadece bir tuşa basmaktır, alarma gerek yoktur.
flipdoubt

Yanıtlar:


56

Form.AcceptButton özelliğini kontrol edin . Bunu, bir form için varsayılan bir düğme belirtmek için kullanabilirsiniz, bu durumda enter tuşuna basmak için.

Dokümanlardan:

Bu özellik, kullanıcı uygulamanızda ENTER tuşuna bastığında gerçekleşecek varsayılan bir eylem belirlemenizi sağlar. Bu özelliğe atanan düğme, geçerli formda bulunan veya geçerli formdaki bir kapsayıcıda bulunan bir IButtonControl olmalıdır.

Ayrıca, kullanıcının çıkışa basması için bir CancelButton özelliği de vardır .


1
Teşekkürler @mdm, bu benim için en iyisi oldu. :) Daha fazla sayım olduğunda olumlu oylamaya geri döneceğim.
bendr

1
@bendr bende de aynı sorun var .. ama UserControl kullanıyorum .. Form.AcceptButton yok .. nasıl düzeltilir?
Murhaf Sousli

1
Visual Studio, bunun için Özellikler bölmesinde bir alana sahip görünmüyor. Görünüşe göre kodla yapılması gerekiyor. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
Bu, ToolStripButtons için veya bir TextBox veya ToolStripTextBox'ı doğrulamak için ENTER tuşunu kullanmak istiyorsanız çalışmaz. Daha iyi bir yaklaşım, ToolStripTextBox ile benim için çalışan Lucio Fonseca'nın cevabı olacaktır.
Robert S.

Çözümünüzü göremiyorum, daha aydınlanmak için pratik bir alıştırmanız yok
Pedro Ávila

198

Benim için çalışıyor:

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 gerçekten bir numara. Umarım bu sana yardımcı olur.


30
Bana göre tek geçerli cevap bu. e.Handled = true;yetersizdi; öyleydi SuppressKeyPresshile yaptığını.
Jonathon Reinhart

12
textBox1_KeyUp Handled veya SuppressKeyPress'den bağımsız olarak bu durumda ding yapacak
stackuser83

4
Benim için çalışıyor ToolStripTextBox.KeyDown. Başka hiçbir çözüm olmadı. Teşekkürler!
Robert S.

1
Benim textboxve KeyDownetkinliğimde işe yaramadı
Alex Jolig

7
Kabul edilen cevap bu olmalıdır. Mevcut kabul edilen cevap, formun üzerine yerleştirilmiş, rahatsız edici bir standart düğme gerektirir.
Javid

56

Deneyin

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
    }
}

Doğru, ancak yalnızca odak hala Metin Kutusu'ndaysa çalışacaktır. Peki ya kullanıcı Tabönce basarsa ?
mdm

4
@mdm UI tasarımına bağlıdır. Belki de OP bu eylemi yalnızca odak metin kutusundayken istiyor. Bu oldukça yaygındır.
David Heffernan

2
Kullanıcı Tab tuşuna bastıysa, odak artık TextBox üzerinde olmayacaktır, Odaklanacak bir sonraki Contorl, üzerinde Enter tuşuna bastığınızda bu sesi çıkarmayan Düğme Kontrolüdür. :-)
bendr

@David, örneğiniz için teşekkürler. Ben sadece denedim. Ve .KeyPress olayına e.Handled = true değerini koyduğumda, diğer kodların hiçbiri çalışmıyor. Olan tek şey, Metin
Kutusundaki

1
Lucio Fonseca'nın cevabı, sorunu halletmek için bulduğum tek cevaptı.
Jonathon Reinhart

15

e.SuppressKeyPress = true;"Eğer" ifadenizi eklemeniz yeterlidir.

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 veya KeyDown yerine KeyPress'i kullanabilirsiniz, daha verimli ve işte nasıl ele alınacağı

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

ve 'Ding'e barış deyin


2
Bu benim için mükemmel çalıştı. e.Handled, görünüşe göre 'Ding'i devre dışı bırakır. 'Gönder' düğmesini (benim durumumda) varsayılan yapmak benim için işe yaramazdı çünkü formdaki diğer metin kutuları için 'Enter' tuşunu farklı şekilde kullanmak istedim. <br/> <br/> Bu arada : Bu proje için VB kullanıyorum. yani e.KeyChar'ı dönüştürmek yerine, onu dönüştürüyorum: e.KeyChar = ChrW (Anahtarlar Sonra Girin ....
Mark Ainsworth

1
İçinde KeyDown, kullanmak e.Handledve e.SuppressKeyPressbenim için işe yaramadı - hala dinging. Ama KeyPress' event and e.Handled'i kullanmak için burada önerildiği gibi değiştirmek güzelce yaptı.
Jinlye

Bu doğru cevap olmalı, teşekkürler
Firas Shrourou

7

SuppressKeyPressTuşa basıldıktan sonra devam eden işlemeyi durdurmak için kullanın .

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

Bu benim için çalıştı bir KeyDown işlemeye çalışırken bu yazıya tökezledi.

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

Tuşa Basmanın Engellenmesi, olayın temeldeki kontrole gönderilmesini durdurur. Bu, enter tuşunun o metin kutusunda yapacağı her şeyi manuel olarak işliyorsanız çalışmalıdır. Visual Basic için üzgünüm.


2

Bu cevaba ulaşma şansı çok az ama diğer bazı cevaplar gerçekten korkutucu. Olayı bastırmak KeyDowntek vuruşta 2 ek olayı öldürür. Ayar e.Handledmülkü truebu bağlamda işe yaramaz.
En iyi yol, Form.AcceptButtonözelliği gerçek Arama Düğmesine ayarlamaktır. Anahtarı
kullanmanın başka bir yolu da var Enter- bazı insanlar bunun TABdüğme olarak hareket etmesini isteyebilir . Bunu yapmak için, yeni bir alan ekleyin Button, Locationözelliğini alan dışına ayarlayın Form(yani (-100, -100)) - Visibleözelliği bazı durumlarda işleyicileri falsedevre dışı bırakacak şekilde ayarlamak Button. Form.AcceptButtonMülkiyeti yeni düğmeniz olarak ayarlayın . Gelen Clickolay işleyicisi aşağıdaki kodu ekleyin
this.SelectNextControl(ActiveControl, true, true, true, true)

Şimdi, aktarmak isteyebilirsiniz focussadece focusbunu TextBoxher iki test de isteyebilirsiniz size ActiveControltürü veya kullanım e.Supresskullanımı anlamına gelmez kontrollerin olay işleyicileri özellik Enterolarak TAB bu kadar. Yakalamana bile gerek yoke.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
        }
    });

İşte aradığım bu.
Sid

1

WinForms'da Enter tuşu, AcceptButton form özelliği belirtilmediğinden Ding sesine neden olur. Bir AcceptButton'a ihtiyacınız yoksa, ding sesi KeyPreview formunu true olarak ayarlayarak ve aşağıdaki KeyPress olayını girerek bastırılabilir:

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

Hangi kontrolün aktif olduğu önemli değil, Enter tuşuna basıldığında artık çınlama sesi olmayacaktır. Anahtar olay işleme sırası KeyDown, KeyPress ve KeyUp olduğundan, Enter tuşu kontroller için KeyDown olayları için çalışmaya devam edecektir.


0

Ara düğmenizin IsDefault özelliğini olarak ayarlayın true. Bu, onu varsayılan bir düğme yapacak ve Enter'a basıldığında otomatik olarak tıklanacaktır.


To specify the default button of a form, set the AcceptButton property of the form to the desired button.
Bağlandığınız

Evet, bunu kendim araştırdım. Görünüşe göre her iki yaklaşım da birbirinin yerine geçebilir. AcceptButtondaha şık görünüyor ama ben IsDefaultkendime alıştım .
Zruty

0

Bu problemle yeterince uzun yaşadım ve buraya baktım.

Bunu epey bir süre düşündükten ve düzeltmenin en basit yolunu istedikten sonra, düzeltmenin en kolay ama o kadar da zarif olmayan yolunu buldum.

İşte yaptığım şey.

  1. Form üzerine 2 görünmez düğme "Tamam" ve "İptal" koyun.
  2. Formdaki AcceptButton ve CancelButton Özelliklerini görünmez düğmelere ayarlayın.
  3. Düğmelere kod eklenmedi!

Bu, ToolStripMenu dahil olmak üzere bu başlıkta listelenen tüm ikincil sorunları çözdü. En büyük şikayetim BindingNavigator idi, o an gitmek için Geçerli konuma bir kayıt numarası girip enter tuşuna bastığımda.

Programcının giriş düğmesine basıldığında bir arama işlevi istediği orijinal soruya göre, arama kodunu görünmez Tamam Düğmesine koydum!

Şimdiye kadar bu tüm sorunları çözmüş gibi görünüyor, ancak hepimizin Visual Studio ile bildiği gibi, muhtemelen bir şeyler ortaya çıkacaktır.

Düşünebildiğim diğer olası zarif yol, projelerimin çoğu için çok işe yarayan yeni bir tuş vuruşu işleme sınıfı yazmak olabilir.


0

Metin kutunuzun çoklu satırını true olarak ayarlayabilir ve ardından Enter tuşuna basmayı tutabilirsiniz.

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

Çok satırlı bir metin kutusu için metin kutusu özelliklerini değiştirdim ve benim için çalışıyor.


Cevap aşağıda 22 Şubat'ta belirtilmişti. [Girin] ile de ilgilenmelisiniz;)
Goodies

-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
Bu sadece kod içeren gereksiz bir cevaptır, açıklama yoktur. Ayrıca, Multilinekodun tamamı tamamen alakasızdır.
Jonathon Reinhart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.