Trong C# .NET 2.0, tôi có một ComboBox WinForms với ComboBoxStyle DropDownList. Tuy nhiên, trình đơn thả xuống xuất hiện bất cứ khi nào người dùng nhấp vào bất kỳ đâu trên hộp tổ hợp. Thay vào đó, tôi muốn nó chỉ mở khi người dùng nhấp chuột một cách rõ ràng vào nút thả xuống. Khi người dùng nhấp vào phần còn lại của hộp kết hợp, tôi chỉ muốn gán cho nó tiêu điểm bàn phím để họ có thể sử dụng một số lệnh bàn phím trên mục đã chọn. Cách tốt nhất để làm điều này là gì?Làm cách nào để buộc một ComboBox kiểu DropDownList chỉ mở khi người dùng nhấp vào nút thả xuống?
Trả lời
Sau một số sự giúp đỡ từ những câu trả lời khác, tôi đến giải pháp này nhanh chóng:
public class MyComboBox : ComboBox
{
public MyComboBox()
{
FlatStyle = FlatStyle.Popup;
DropDownStyle = ComboBoxStyle.DropDownList;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0201 /* WM_LBUTTONDOWN */ || m.Msg == 0x0203 /* WM_LBUTTONDBLCLK */)
{
int x = m.LParam.ToInt32() & 0xFFFF;
if (x >= Width - SystemInformation.VerticalScrollBarWidth)
base.WndProc(ref m);
else
{
Focus();
Invalidate();
}
}
else
base.WndProc(ref m);
}
}
Bạn có thể nhận được vị trí X, Y của nhấp chuột và từ đó bạn có thể buộc nó bị sập nếu nó không ở trên biểu tượng "thả xuống" (vì thiếu từ tốt hơn).
Bạn có hai vấn đề cần xem xét. Việc đầu tiên là khá đơn giản: xác định xem thả xuống nên được mở hoặc đóng. Mã này có thể làm điều đó:
void comboBox1_MouseClick(object sender, MouseEventArgs e)
{
ComboBox combo = sender as ComboBox;
int left = combo.Width - (SystemInformation.HorizontalScrollBarThumbWidth + SystemInformation.HorizontalResizeBorderThickness);
if (e.X >= left)
{
// They did click the button, so let it happen.
}
else
{
// They didn't click the button, so prevent the dropdown.
}
}
Vấn đề thứ hai quan trọng hơn - thực sự ngăn chặn trình đơn thả xuống xuất hiện. Cách tiếp cận đơn giản nhất là:
comboBox1.DropDownStyle = ComboBoxStyle.DropDown;
Nhưng điều đó cho phép nhập vào ô mà bạn không muốn.
Tôi dành khoảng 15 phút để xem các tùy chọn và dường như ngăn chặn trình đơn thả xuống xuất hiện đồng thời ngăn người dùng nhập vào menu thả xuống, bạn cần phải phân lớp kiểm soát. Bằng cách đó, bạn có thể ghi đè lên OnMouseClick() và chỉ gọi base.OnMouseClick() khi họ đã nhấp vào nút. Nó sẽ giống như thế này (chưa được kiểm tra):
public class CustomComboBox : ComboBox
{
protected override void OnMouseClick(MouseEventArgs e)
{
base.OnMouseClick(e);
int left = this.Width - (SystemInformation.HorizontalScrollBarThumbWidth + SystemInformation.HorizontalResizeBorderThickness);
if (e.X >= left)
{
// They did click the button, so let it happen.
base.OnMouseClick(e);
}
else
{
// They didn't click the button, so prevent the dropdown.
// Just do nothing.
}
}
}
- 1. Giữ trình đơn thả xuống Bootstrap mở khi nhấp vào
- 2. Danh sách thả xuống Combobox
- 3. Làm thế nào để một ComboBox chụp chuột khi nó được thả xuống?
- 4. Chỉ dừng một nút tắt khi đóng khi nhấp vào
- 5. Làm cách nào để bạn xử lý nhiều lựa chọn trong điều khiển kiểu thả xuống?
- 6. C# ComboBox trong kiểu DropDownList, làm cách nào để đặt văn bản?
- 7. Làm cách nào để mở một tab mới khi nhấp vào nút trong Rails?
- 8. Làm thế nào để tự thả xuống một DataGridViewComboBoxColumn?
- 9. Thêm một chuỗi văn bản vào một trường nhập khi người dùng nhấp vào một nút
- 10. Thả xuống Combobox bên trong datagridview
- 11. Làm cách nào để mở ứng dụng Cài đặt khi người dùng nhấn một nút?
- 12. WPF: Thả xuống của một Combobox highlightes văn bản
- 13. Làm cách nào để chạy mã PHP khi người dùng nhấp vào một liên kết?
- 14. Làm thế nào để buộc LostFocus khi nút được nhấp
- 15. Làm thế nào để có được ID của người dùng nút chỉ cần nhấp?
- 16. Thả xuống Hộp tổ hợp trên nút bấm
- 17. trường hợp ComboBox thả xuống nhạy cảm
- 18. Java: Làm cách nào để thêm JMenu vào JPanel hoặc tạo nút thả xuống?
- 19. Cách kiểm tra người dùng đã nhấp vào nút làm mới hoặc đóng x
- 20. làm cách nào để mở trang trong tab mới khi nhấp vào nút trong asp.net?
- 21. Làm cách nào để mở ứng dụng khi người dùng nhấp đúp vào tệp được liên kết của ứng dụng?
- 22. Ràng buộc danh sách thả xuống với JQuery trong Asp.Net
- 23. Làm cách nào để hiển thị trình tải xuống trong hộp văn bản khi nhấp vào nút?
- 24. làm thế nào để hiển thị tùy chọn khi người dùng nhấp vào UITableViewCellAccessoryDetailDisclosureButton
- 25. twitter bootstrap autocomplete thả xuống/combobox với Knockoutjs
- 26. Xóa lựa chọn thả xuống trên nút radio nhấp
- 27. Cách tạo tùy chỉnh "xác nhận" & tạm dừng js cho đến khi người dùng nhấp vào nút?
- 28. DataGridComboBoxColumn - Tự động thả xuống trên một cú nhấp chuột
- 29. Tạo nút thả xuống chỉ với HTML & CSS?
- 30. Danh sách thả xuống ràng buộc bên trong GridView edititemtemplate
Chiều rộng thanh cuộn là hữu ích, nhưng sử dụng các sự kiện WinForms chuột/chức năng không hữu ích. Chúng được gọi là quá muộn. – Eric
Các sự kiện và chức năng của WinForms được gọi cùng lúc với các thông báo Windows thông thường. Đó là việc xử lý chúng quan trọng. Tìm cách ngăn chặn hành vi mặc định là thử thách, vì thời gian là như nhau. –
Tôi đã viết một cách ẩn dụ. Trong nội bộ, có vẻ như trước khi các sự kiện chuột WinForms được gọi là bao giờ, trình đơn thả xuống xuất hiện VÀ sự kiện thả xuống được gửi đi. Vì vậy, bằng cách sử dụng các sự kiện WinForms là không đủ để ngăn chặn thả xuống từ xuất hiện. – Eric