Hentikan 'Ding' saat menekan Enter


124

Saya memiliki Aplikasi Formulir Windows yang sangat sederhana. Dan, di Windows (atau, setidaknya Aplikasi Formulir Windows), saat Anda menekan Enter saat berada di dalam Kontrol Kotak Teks Garis Tunggal, Anda akan mendengar bunyi Ding. Ini adalah suara yang tidak menyenangkan, yang menandakan Anda tidak dapat memasukkan baris baru, karena ini adalah TextBox satu baris.

Ini semua baik-baik saja. Namun, dalam Formulir saya, saya memiliki 1 Kotak Teks, dan Tombol Pencarian. Dan saya mengizinkan pengguna untuk Melakukan pencarian dengan menekan Enter setelah mereka selesai mengetik, jadi mereka tidak perlu menggunakan mouse untuk mengklik Tombol Pencarian.

Tapi suara Ding ini terdengar. Itu sangat mengganggu.

Bagaimana kita bisa membuatnya sehingga suara itu tidak diputar sama sekali di Formulir saya?

@David H - Begini cara saya mendeteksi tombol enter:

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

Bagaimana Anda mendeteksi bahwa Enter telah ditekan saat fokus ada di kotak teks?
David Heffernan

Di Properties Pane, Anda mengklik dua kali KeyDown atau KeyUp Event. Kemudian, di Tampilan Kode, Anda mengetik kode yang akan saya masukkan ke pertanyaan saya untuk yah.
bendr

2
KeyPress mungkin adalah acara yang tepat, dan Anda ingin menyetel e.Handled = true
David Heffernan

Terima kasih, @David, saya tidak tahu ini :)
bendr

7
Saya berharap ada cara untuk menekan ding yang mengganggu tetapi biarkan tombol ditekan untuk meluap. Terkadang penekanan tombol hanya menekan tombol, tidak perlu alarm.
flipdoubt

Jawaban:


56

Lihat properti Form.AcceptButton . Anda dapat menggunakannya untuk menentukan tombol default untuk formulir, dalam hal ini untuk menekan enter.

Dari dokumen:

Properti ini memungkinkan Anda untuk menentukan tindakan default yang akan terjadi saat pengguna menekan tombol ENTER di aplikasi Anda. Tombol yang ditetapkan ke properti ini harus IButtonControl yang ada di formulir saat ini atau berada di dalam wadah di formulir saat ini.

Ada juga properti CancelButton ketika pengguna menekan escape.


1
Terima kasih @mdm, ini yang terbaik untuk saya. :) Saya akan kembali untuk memberi suara positif ketika saya memiliki lebih banyak perwakilan.
bendr

1
@ bendr saya memiliki masalah yang sama .. tetapi saya menggunakan UserControl .. tidak memiliki Form.AcceptButton .. bagaimana cara memperbaikinya?
Murhaf Sousli

1
Visual Studio tampaknya tidak memiliki bidang di panel Properti untuk ini. Itu harus dilakukan dalam kode, rupanya. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
Ini tidak akan berfungsi untuk ToolStripButtons atau jika Anda ingin menggunakan tombol ENTER untuk memvalidasi TextBox atau ToolStripTextBox. Pendekatan yang lebih baik adalah jawaban dari Lucio Fonseca yang bekerja untuk saya dengan ToolStripTextBox.
Robert S.

Saya tidak dapat melihat solusi Anda, Anda tidak memiliki latihan praktis untuk menjadi lebih tercerahkan
Pedro Ávila

198

Ini bekerja untuk saya:

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 adalah trik sebenarnya. Saya harap itu membantu Anda.


30
Ini satu-satunya jawaban yang valid, menurut saya. e.Handled = true;tidak cukup; itu SuppressKeyPressyang berhasil.
Jonathon Reinhart

12
textBox1_KeyUp akan bekerja dalam situasi ini terlepas dari Handled atau SuppressKeyPress
stackuser83

4
Bekerja untuk saya dengan ToolStripTextBox.KeyDown. Tidak ada solusi lain yang berhasil. Terima kasih!
Robert S.

1
Itu tidak berhasil untuk saya di acara textboxdan sayaKeyDown
Alex Jolig

7
Ini harus menjadi jawaban yang diterima. Jawaban yang diterima saat ini membutuhkan tombol standar yang ditempatkan pada formulir yang tidak menyenangkan.
Javid

56

Mencoba

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

Benar, tetapi hanya akan berfungsi jika fokus masih ada di TextBox. Bagaimana jika pengguna menekan Tablebih dulu?
mdm

4
@mdm Tergantung pada desain UI. Mungkin OP hanya menginginkan tindakan ini ketika fokus ada pada kotak teks. Itu sangat umum.
David Heffernan

2
Jika pengguna menekan Tab, fokus tidak lagi berada di TextBox, Contorl berikutnya yang akan difokuskan adalah Kontrol Tombol, yang tidak mengeluarkan suara saat Anda menekan Enter di atasnya. :-)
bendr

@David, terima kasih atas teladan Anda. Saya baru mencobanya. Dan Setiap kali saya meletakkan e.Handled = true di acara .KeyPress, tidak ada kode lain yang dijalankan. Satu-satunya hal yang terjadi adalah semua Teks di TextBox menjadi dipilih (dan saya bahkan tidak memiliki kode yang memilih teks apa pun)
bendr

1
Jawaban Lucio Fonseca adalah satu-satunya jawaban yang saya temukan untuk mengatasi masalah tersebut.
Jonathon Reinhart

15

Tambahkan saja e.SuppressKeyPress = true;pernyataan "jika" Anda.

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

Anda dapat Menggunakan KeyPress daripada KeyUp atau KeyDown yang lebih efisien dan berikut cara menanganinya

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

dan katakan damai pada 'Ding'


2
Ini bekerja dengan sempurna untuk saya. e. Ditangani tampaknya menonaktifkan 'Ding'. Menjadikan tombol 'Kirim' (dalam kasus saya) sebagai default, tidak akan berhasil untuk saya karena saya ingin menangani tombol 'Enter' secara berbeda untuk kotak teks lain pada formulir. <br/> <br/> Ngomong-ngomong : Untuk proyek ini saya menggunakan VB. jadi alih-alih mentransmisikan e.KeyChar, saya mengonversinya: jika e.KeyChar = ChrW (Keys.Enter Then ....
Mark Ainsworth

1
Di dalam KeyDown, menggunakan e.Handleddan e.SuppressKeyPresstidak berhasil untuk saya - masih berbunyi. Tetapi mengubahnya seperti yang disarankan di sini untuk menggunakan KeyPress' event and e.Handled` melakukannya dengan baik.
Jinlye

Ini seharusnya jawaban yang benar, terima kasih
Firas Shrourou

7

Gunakan SuppressKeyPressuntuk menghentikan proses lanjutan dari tombol setelah menanganinya.

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

Saya tersandung pada posting ini ketika mencoba menangani KeyDown, ini berhasil untuk saya.

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

Menekan Key Press menghentikan pengiriman acara ke kontrol yang mendasarinya. Ini harus berfungsi jika Anda secara manual menangani semua yang akan dilakukan tombol enter di dalam kotak teks itu. Maaf tentang Visual Basic.


2

Ada sedikit kemungkinan seseorang mendapatkan jawaban ini, tetapi beberapa jawaban lain benar-benar menakutkan. Peristiwa yang ditekan KeyDownmembunuh 2 peristiwa tambahan dalam satu serangan. Mengatur e.Handledproperti ke truetidak berguna dalam konteks ini.
Cara terbaik adalah mengatur Form.AcceptButtonproperti ke Tombol Pencarian yang sebenarnya.
Ada juga cara lain untuk menggunakan Enterkunci - beberapa orang mungkin menginginkannya sebagai TABtombol. Untuk melakukan itu, tambahkan baru Button, setel Locationpropertinya di luar Formarea (mis. (-100, -100)) - menyetel Visibleproperti ke falsemungkin menonaktifkan Buttonpenangan dalam beberapa kasus. Setel Form.AcceptButtonproperti ke tombol baru Anda. Dalam Clickevent handler tambahkan kode berikut
this.SelectNextControl(ActiveControl, true, true, true, true)

Sekarang, Anda mungkin ingin mentransfer focushanya jika focuspada TextBoxAnda mungkin ingin salah satu ActiveControljenis pengujian atau menggunakan e.Supressproperti di pengendali kejadian kontrol tidak dimaksudkan untuk digunakan Enterseperti TAB Itu saja. Anda bahkan tidak perlu menangkape.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
        }
    });

Inilah yang saya cari.
Sid

1

Pada WinForms, tombol Enter menyebabkan suara Ding karena properti formulir AcceptButton tidak ditentukan. Jika Anda tidak membutuhkan AcceptButton, suara ding dapat ditekan dengan mengatur bentuk KeyPreview menjadi true dan memasukkan event KeyPress berikut:

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

Tidak peduli kontrol apa yang aktif, tidak akan ada lagi suara ding saat menekan tombol Enter. Karena urutan pemrosesan peristiwa kunci adalah KeyDown, KeyPress dan KeyUp, tombol Enter akan tetap berfungsi untuk peristiwa KeyDown untuk kontrol.


0

Setel properti IsDefault tombol Search Anda ke true. Ini akan menjadikannya tombol default dan akan diklik secara otomatis saat Enter ditekan.


Dari dokumen yang Anda To specify the default button of a form, set the AcceptButton property of the form to the desired button.
tautkan

Ya, saya telah menyelidikinya sendiri. Tampaknya kedua pendekatan tersebut dapat dipertukarkan. AcceptButtonsepertinya lebih bergaya, tapi aku sudah terbiasa IsDefault.
Zruty

0

Saya sudah cukup lama menghadapi masalah ini dan mencarinya di sini.

Setelah memikirkan hal ini selama beberapa waktu dan menginginkan cara termudah untuk memperbaikinya, saya menemukan cara termudah tetapi tidak begitu elegan untuk memperbaikinya.

Inilah yang saya lakukan.

  1. Letakkan 2 tombol tak terlihat "Ok" dan "Batal" di formulir.
  2. Setel Properti AcceptButton dan CancelButton pada formulir ke tombol tak terlihat.
  3. Tidak menambahkan kode ke tombol!

Ini memecahkan semua masalah sekunder yang tercantum di utas ini termasuk ToolStripMenu. Keluhan terbesar saya adalah BindingNavigator, ketika saya memasukkan nomor catatan ke posisi saat ini untuk menavigasi ke dan menekan enter.

Sesuai pertanyaan awal di mana pemrogram menginginkan fungsi pencarian ketika tombol enter ditekan, saya cukup memasukkan kode pencarian di Tombol OK yang tidak terlihat!

Sejauh ini tampaknya ini menyelesaikan semua masalah tetapi seperti yang kita semua tahu dengan Visual Studio, sesuatu mungkin akan muncul.

Satu-satunya cara elegan lain yang mungkin saya pikirkan adalah menulis kelas penanganan keystroke baru yang merupakan cara untuk banyak pekerjaan untuk sebagian besar proyek saya.


0

Anda dapat mengatur multi-baris kotak teks Anda ke true lalu menangani penekanan tombol 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

saya mengubah properti kotak teks untuk kotak teks multiline dan berfungsi untuk saya.


Jawaban sudah disebutkan di bawah ini pada tanggal 22 Februari. Anda harus mengurus [masuk] juga;)
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
Ini adalah jawaban yang berlebihan dengan hanya kode, tanpa penjelasan. Selain itu, semua Multilinekode sama sekali tidak relevan.
Jonathon Reinhart
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.