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