2011-07-12 22 views
9

Nếu người dùng truy cập nhập vào hộp văn bản biểu mẫu cửa sổ với sự kiện KeyUp Sự kiện, cửa sổ sẽ phát ra tiếng bíp hoặc. Tôi không thể xác định tại sao điều này xảy ra và làm thế nào tôi có thể tránh điều này.Tránh Windows 'Ding' khi Enter được nhấn trong TextBox với OnKeyUp

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

7

Tôi tưởng tượng này là do sự kết hợp của:

  • MultiLine = false
  • Không nút mặc định trên các hình thức

vì single-line textbox chuyển tiếp nhập chìa khóa dẫn đến nút mặc định. Các ding được tạo ra khi một nút mặc định không thể được tìm thấy.

+0

Bây giờ tôi hiểu được điều này. Và tôi đã kiểm tra điều đó. Với MultiLine = false: Nếu tôi đặt nút này ở dạng acceptbutton, nó sẽ được kích hoạt ngay lập tức. Vì vậy, không có ding, nhưng tôi đã nhiều nút khác và đây không phải là nút chấp nhận của tôi. Nếu tôi đặt MultiLine = true thì ding cũng biến mất. Đây là những gì tôi ưa thích, bổ sung WordWrap = false. Cảm ơn đã giúp đỡ. – ibram

1

Sau vài giờ đào cho một giải pháp, tôi chỉ có một giải pháp thay thế, nhưng không phải là giải pháp thực sự cho vấn đề này. Bây giờ tôi đang sử dụng KeyDown để thay thế.

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(); 
    } 
} 

Và đề xuất hữu ích cho tất cả các nhà phát triển: Đừng kiểm tra âm thanh tắt tiếng của ứng dụng của bạn. ;-)

+1

Ghi đè ProcessCmdKey() để nó hoạt động bất kỳ điều khiển nào có tiêu điểm. Quay trở lại đúng khi bạn nhận ra Keys.Enter để tránh ding. Bạn có thể sử dụng Button.PerformClick() btw. –

+0

Button.PerformClick() là một điểm tốt. Tôi không biết điều đó. Nhưng ProcessCmdKey sẽ làm phức tạp công việc của tôi, bởi vì tôi có rất nhiều nút và hộp văn bản. Tôi sẽ luôn luôn cần phải kiểm tra ai là người gửi. Tôi đang sử dụng phương pháp ProcessDialogKey cho một số sự kiện quan trọng trên toàn cầu như F3 để lưu, F1 để được trợ giúp ... – ibram

3

Dưới đây là câu trả lời thực tế:

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 

này ăn bấm phím, mà ngăn cản ding.

11

giải pháp thực tế cho việc loại bỏ các âm thanh:

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

Không ai trong số các giải pháp nêu trên đã làm công việc cho tôi ... nhưng đây là giải pháp đơn giản của tôi!
Chỉ hoạt động khi bạn không cần thêm một Nút chấp nhận trong Ứng dụng của mình.

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

Bằng cách này, bạn sẽ không nghe thấy tiếng ping trên hộp văn bản cụ thể với tiêu điểm khi nhấn 'Enter'!

0

Tôi đã có một phiên bản của vấn đề này sẽ xảy ra khi tôi gọi myDialog.ShowDialog() từ một điều khiển tùy chỉnh khi người dùng nhấn nhập từ một hộp văn bản một dòng.

(Họ đặt một số sản phẩm vào một hộp văn bản, nhấn Enter, và pops thoại và cho phép họ chọn từ các kích thước có sẵn. Nhưng đó là bữa ăn tối gây phiền nhiễu nếu một tiếng chuông đóng mỗi khi pops thoại.)

Tôi bị mắc kẹt trong sự kiện quan trọng trong hộp văn bản, và đặt e.Handled và e.SupressKeypress, nhưng điều đó không giải quyết được vấn đề. Sau đó, tôi nhận thấy rằng nếu tôi nhận xét cuộc gọi đến myDialog.ShowDialog(), sau đó tôi đã không nhận được âm thanh, như kỳ lạ như vậy. Trong trường hợp đó, e.Handled và e.SupressKeypress đã chặn chuông. Tôi nghĩ có lẽ sự kiện này đã được chuyển sang hộp thoại, vì vậy tôi đã chặn sự kiện keydown ở cấp biểu mẫu và trên mọi phần tử của biểu mẫu có tổ hợp phím, và đặt e.Handled và e.SuppressKeypress trong mỗi một trong số đó, nhưng điều đó không khắc phục được.

Tôi đã thử đặt nút gửi trên biểu mẫu và đặt thuộc tính AcceptButton của biểu mẫu thành nút đó, nhưng điều đó cũng không giúp ích gì.

Tôi đã thử gọi Application.DoEvents() trước khi gọi myDialog.ShowDialog(), nhưng điều đó không khắc phục được.

Tôi nhận thấy rằng gọi Application.DoEvents() khiến chuông phát ngay cả khi cuộc gọi đến myDialog.ShowDialog() đã được nhận xét! Như thể gọi DoEvents đang xử lý sự kiện hiện tại mà không chú ý đến các vòng loại e.Handled và e.SupressKeypress.

Vì vậy .. Tôi nghĩ nếu tôi để sự kiện hiện tại diễn ra trong khi vòng loại đang diễn ra, và thì nâng cao hộp thoại của tôi sau đó?

Vì vậy, tôi đặt myDialog.ShowDialog() vào một phần BeginInvoke (vì ấn tượng của tôi là một invoke thêm tin nhắn vào hàng đợi thông điệp chính gây phương pháp để có được gọi khi thông điệp đó được xử lý):

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

Tin hay không, đã sửa nó - không có chuông.

(Tôi thường sử dụng gọi khi tôi cần phải cập nhật xem khi một sợi nền gọi là gọi lại, kể từ WinForms quan điểm không cho phép mình được cập nhật từ một thread khác với các chủ đề chính.)

Vì vậy, Tôi đoán điều khiển tùy chỉnh, trong đó hộp văn bản một dòng là, nơi một nút chấp nhận là cần thiết - nhưng một điều khiển tùy chỉnh không có thuộc tính AcceptButton.

Lập trình WinForms có vẻ là một chút nghệ thuật đen. Giống như mọi loại lập trình khác, tôi đoán vậy.

Các vấn đề liên quan