Dừng 'Ding' khi nhấn Enter


124

Tôi có một ứng dụng Windows Forms rất đơn giản. Và, trong Windows (hoặc ít nhất là Ứng dụng Windows Forms), khi bạn nhấn Enter khi đang ở trong Điều khiển TextBox một dòng, bạn sẽ nghe thấy tiếng Ding. Đó là một âm thanh khó chịu, cho biết rằng bạn không thể nhập dòng mới, vì nó là một TextBox một dòng.

Điều này là tốt. Tuy nhiên, trong Biểu mẫu của tôi, tôi có 1 TextBox và một Nút tìm kiếm. Và tôi cho phép người dùng Thực hiện tìm kiếm bằng cách nhấn Enter sau khi họ nhập xong, vì vậy họ không phải sử dụng chuột để nhấp vào Nút Tìm kiếm.

Nhưng âm thanh Ding này xảy ra. Nó rất khó chịu.

Làm thế nào chúng tôi có thể làm cho nó để âm thanh hoàn toàn không phát trong Biểu mẫu của tôi?

@David H - Đây là cách tôi phát hiện nhấn enter:

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

Làm cách nào để bạn phát hiện ra rằng Enter đã được nhấn khi tiêu điểm nằm trong hộp văn bản?
David Heffernan

Trong Ngăn Thuộc tính, bạn bấm đúp vào Sự kiện KeyDown hoặc KeyUp. Sau đó, trong Chế độ xem mã, bạn nhập mã mà tôi sắp đặt trong câu hỏi của mình cho yah.
uốn cong

2
KeyPress có lẽ là sự kiện đúng, và bạn muốn thiết lập e.Handled = true
David Heffernan

Cảm ơn bạn, @ David, tôi không biết :) này
bendr

7
Tôi ước có một số cách để ngăn chặn tiếng kêu khó chịu nhưng cho phép phím bấm nổi lên. Đôi khi một phím bấm chỉ là một phím bấm, không cần báo thức.
flipdoubt

Câu trả lời:


56

Kiểm tra thuộc tính Form.AcceptButton . Bạn có thể sử dụng nó để chỉ định một nút mặc định cho một biểu mẫu, trong trường hợp này là để nhấn enter.

Từ các tài liệu:

Thuộc tính này cho phép bạn chỉ định một hành động mặc định xảy ra khi người dùng nhấn phím ENTER trong ứng dụng của bạn. Nút được gán cho thuộc tính này phải là IButtonControl ở biểu mẫu hiện tại hoặc nằm trong vùng chứa trên biểu mẫu hiện tại.

Ngoài ra còn có thuộc tính CancelButton khi người dùng nhấn thoát.


1
Cảm ơn bạn @mdm, điều này phù hợp nhất với tôi. :) Mình sẽ quay lại upvote khi có nhiều rep hơn.
uốn cong vào

1
@bendr tôi cũng có vấn đề tương tự .. nhưng tôi đang sử dụng UserControl .. nó không có Form.AcceptButton .. làm thế nào để khắc phục nó?
Murhaf Sousli

1
Visual Studio dường như không có trường trong ngăn Thuộc tính cho việc này. Nó phải được thực hiện trong mã, rõ ràng. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
Điều này sẽ không hoạt động đối với ToolStripButtons hoặc nếu bạn muốn sử dụng phím ENTER để xác thực TextBox hoặc ToolStripTextBox. Cách tiếp cận tốt hơn sẽ là câu trả lời của Lucio Fonseca làm việc cho tôi với ToolStripTextBox.
Robert S.

Tôi không thể thấy giải pháp của bạn, bạn không có một bài tập thực hành để giác ngộ hơn
Pedro Ávila

198

Nó hoạt động cho tôi:

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 thực sự là một thủ thuật. Tôi hy vọng rằng sẽ giúp bạn.


30
Đây là câu trả lời hợp lệ duy nhất, theo ý kiến ​​của tôi. e.Handled = true;không đủ; nó là SuppressKeyPresscái đã làm lừa.
Jonathon Reinhart,

12
textBox1_KeyUp sẽ ding trong tình huống này không phụ thuộc Handled hoặc SuppressKeyPress
stackuser83

4
Làm việc cho tôi với ToolStripTextBox.KeyDown. Không có giải pháp nào khác. Cảm ơn!
Robert S.

1
Nó không phù hợp với tôi về sự kiện textboxvà của tôiKeyDown
Alex Jolig.

7
Đây phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận hiện tại yêu cầu một nút tiêu chuẩn được đặt trên biểu mẫu gây khó chịu.
Javid

56

Thử

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

Đúng, nhưng nó sẽ chỉ hoạt động nếu tiêu điểm vẫn nằm trên TextBox. Còn nếu người dùng nhấn Tabtrước thì sao?
mdm

4
@mdm Phụ thuộc vào thiết kế giao diện người dùng. Có lẽ OP chỉ muốn hành động này khi tiêu điểm nằm trên hộp văn bản. Đó là điều khá phổ biến.
David Heffernan

2
Nếu người dùng nhấn Tab, tiêu điểm sẽ không còn nằm trên TextBox nữa, Contorl tiếp theo sẽ được Focus là Điều khiển nút, không tạo ra âm thanh đó khi bạn nhấn Enter trên đó. :-)
uốn cong vào

@David, cảm ơn vì ví dụ của bạn. Tôi chỉ thử nó. Và bất cứ khi nào tôi đặt e.Handled = true trong sự kiện .KeyPress, không có mã nào khác thực thi. Điều duy nhất điều đó xảy ra là tất cả các văn bản trong TextBox trở nên được lựa chọn (và tôi thậm chí không có mã mà chọn bất kỳ văn bản)
bendr

1
Câu trả lời của Lucio Fonseca là câu trả lời duy nhất mà tôi tìm thấy để giải quyết vấn đề.
Jonathon Reinhart,

15

Chỉ cần thêm e.SuppressKeyPress = true;vào câu lệnh "nếu" của bạn.

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

Bạn có thể sử dụng KeyPress thay vì KeyUp hoặc KeyDown hiệu quả hơn và đây là cách xử lý

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

và nói hòa bình với 'Ding'


2
Điều này làm việc hoàn hảo cho tôi. e.Handled dường như vô hiệu hóa 'Ding'. Đặt nút 'Gửi' (trong trường hợp của tôi) làm mặc định, sẽ không phù hợp với tôi vì tôi muốn xử lý phím 'Enter' khác cho các hộp văn bản khác trên biểu mẫu. <br/> <br/> Nhân tiện : Đối với dự án này, tôi đang sử dụng VB. nên thay vì đúc e.KeyChar, tôi chuyển nó: nếu e.KeyChar = ChrW (Keys.Enter Sau đó ....
Đánh dấu Ainsworth

1
Trong vòng KeyDown, đang sử dụng e.Handlede.SuppressKeyPresskhông hoạt động đối với tôi - vẫn còn dinging. Nhưng thay đổi nó như được đề xuất ở đây để sử dụng KeyPress' event and e.Handled` đã làm điều đó thật tuyệt vời.
Jinlye

Đây sẽ là câu trả lời chính xác, cảm ơn
Firas Shrourou

7

Sử dụng SuppressKeyPressđể dừng tiếp tục xử lý tổ hợp phím sau khi xử lý.

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

Tôi đã vấp phải bài đăng này khi cố gắng xử lý KeyDown mà điều này đã làm việc cho tôi.

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

Nhấn phím Nhấn phím sẽ dừng sự kiện được gửi đến điều khiển bên dưới. Điều này sẽ hoạt động nếu bạn đang xử lý thủ công mọi thứ mà phím enter sẽ thực hiện trong hộp văn bản đó. Xin lỗi về Visual Basic.


2

Có rất ít cơ hội để bất cứ ai có được câu trả lời này nhưng một số câu trả lời khác thực sự đáng sợ. Sự kiện áp chế khi KeyDowngiết thêm 2 sự kiện trong một lần tấn công. Đặt thuộc e.Handledtính truelà vô ích trong bối cảnh này.
Cách tốt nhất là đặt thuộc Form.AcceptButtontính thành Nút tìm kiếm thực tế.
Cũng có một cách khác để sử dụng Enterphím - một số người có thể muốn nó hoạt động như một TABnút bấm. Để làm điều đó, hãy thêm mới Button, đặt thuộc tính của nó Locationbên ngoài Formvùng (tức là (-100, -100)) - đặt thuộc Visibletính falsecó thể vô hiệu hóa Buttontrình xử lý trong một số trường hợp. Đặt thuộc Form.AcceptButtontính thành nút mới của bạn. Trong Clicktrình xử lý sự kiện, hãy thêm mã sau
this.SelectNextControl(ActiveControl, true, true, true, true)

Bây giờ, bạn có thể chỉ muốn chuyển focuskhi focusnó trên TextBoxbạn có thể muốn ActiveControlloại thử nghiệm hoặc sử dụng e.Supressthuộc tính trong các trình xử lý sự kiện của các điều khiển không được sử dụng Enternhư TAB đó. Bạn thậm chí không cần phải chụpe.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
        }
    });

Đây là những gì tôi đang tìm kiếm.
Sid

1

Trên WinForms, phím Enter gây ra âm thanh Ding vì thuộc tính biểu mẫu AcceptButton không được chỉ định. Nếu bạn không cần AcceptButton, âm thanh ding có thể bị chặn bằng cách đặt biểu mẫu KeyPreview thành true và nhập sự kiện KeyPress sau:

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

Bất kể điều khiển nào đang hoạt động, sẽ không còn âm thanh ding khi nhấn phím Enter. Vì thứ tự xử lý sự kiện chính là KeyDown, KeyPress và KeyUp, phím Enter sẽ vẫn hoạt động cho các sự kiện KeyDown cho các điều khiển.


0

Đặt thuộc tính IsDefault của nút Tìm kiếm của bạn thành true. Điều này sẽ làm cho nó trở thành một nút mặc định và nó sẽ được tự động nhấp khi nhấn Enter.


Từ các tài liệu bạn đã liên kếtTo specify the default button of a form, set the AcceptButton property of the form to the desired button.
mdm

Vâng, tôi đã tự mình điều tra điều này. Có vẻ như cả hai cách tiếp cận đều có thể thay thế cho nhau. AcceptButtoncó vẻ phong cách hơn, nhưng tôi đã quen với IsDefaultbản thân mình.
Zruty

0

Tôi đã sống với vấn đề này đủ lâu và tìm kiếm nó ở đây.

Sau khi suy nghĩ về điều này một thời gian và muốn cách đơn giản nhất để sửa nó, tôi đã nghĩ ra một cách dễ nhất nhưng không quá thanh lịch để sửa nó.

Đây là những gì tôi đã làm.

  1. Đặt 2 nút vô hình "Ok" và "Hủy" trên biểu mẫu.
  2. Đặt Thuộc tính AcceptButton và CancelButton trên biểu mẫu thành các nút ẩn.
  3. Không có mã nào được thêm vào các nút!

Điều này đã giải quyết tất cả các vấn đề phụ được liệt kê trong chủ đề này bao gồm cả ToolStripMenu. Khiếu nại lớn nhất của tôi là BindingNavigator, khi tôi nhập một số bản ghi vào Vị trí hiện tại để điều hướng đến và nhấn enter.

Theo câu hỏi ban đầu, trong đó lập trình viên muốn có chức năng tìm kiếm khi nhấn nút enter, tôi chỉ cần đặt mã tìm kiếm vào Nút OK vô hình!

Cho đến nay, điều này dường như giải quyết được tất cả các vấn đề nhưng như chúng ta đã biết với Visual Studio, có thể sẽ xảy ra một số vấn đề.

Cách duy nhất có thể có khác mà tôi có thể nghĩ ra là viết một lớp xử lý phím bấm mới, đây là cách có ích cho hầu hết các dự án của tôi.


0

Bạn có thể đặt nhiều dòng trong hộp văn bản của mình thành true rồi nhấn phím 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

tôi đã thay đổi thuộc tính hộp văn bản cho hộp văn bản nhiều dòng và nó phù hợp với tôi.


Câu trả lời đã được nêu dưới đây trên 22-feb. Bạn phải chăm sóc [nhập] quá;)
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
Đây là một câu trả lời thừa chỉ có mã, không có lời giải thích. Ngoài ra, tất cả các Multilinemã hoàn toàn không liên quan.
Jonathon Reinhart,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.