2011-11-19 63 views
6

Trong WinForms, tôi thường có vòng lặp chạy trên một mục Listbox chọn.Winforms - Cách ngăn lựa chọn mục Listbox

Trong thời gian đó, tôi không muốn người dùng chọn các mục trong hộp danh sách đó bằng chuột hoặc các phím.

Tôi đã xem MyListbox.enabled = false nhưng nó sẽ loại bỏ tất cả các mục. Không muốn điều đó.

Cách ngăn chọn các mục trong Listbox?

Trả lời

5

Chuyển các Listbox.SelectionMode tài sản để SelectionMode.None

Sửa như tôi thấy thiết để SelectionMode.None Bỏ chọn tất cả các mục đã chọn trước đó và ném một ngoại lệ nếu SetSelected được gọi vào Listbox.

Tôi nghĩ rằng hành vi mong muốn không thể thực hiện được (mà không muốn bôi xám các mục với Enabled=false).

+0

Nếu tôi làm điều đó vòng lặp của tôi mà đang chạy tại thời điểm đó sẽ không thể để chọn các mục. Hãy nhớ rằng tôi muốn vòng lặp để chọn các mục nhưng không phải là người dùng. – tomfox66

+0

Điều này làm việc trong kịch bản của tôi: Tôi không muốn người dùng có thể kiểm tra các mục, nhưng phải có khả năng kiểm tra chúng theo chương trình. Cảm ơn. –

1

Bạn có thể có một số may mắn nếu bạn phụ lớp ListBox và ghi đè lên các phương pháp OnMouseClick:

public class CustomListBox : ListBox 
{ 
    public bool SelectionDisabled = false; 

    protected override void OnMouseClick(MouseEventArgs e) 
    { 
     if (SelectionDisabled) 
     { 
      // do nothing. 
     } 
     else 
     { 
      //enable normal behavior 
      base.OnMouseClick(e); 
     } 
    } 
} 

Tất nhiên bạn có thể muốn làm thông tin tốt hơn ẩn hoặc thiết kế lớp, nhưng thats các chức năng cơ bản. Có thể có các phương pháp khác bạn cần ghi đè.

7

tôi cũng muốn có một chỉ hộp danh sách đọc, và cuối cùng, sau nhiều tìm kiếm, phát hiện này từ http://ajeethtechnotes.blogspot.com/2009/02/readonly-listbox.html:

public class ReadOnlyListBox : ListBox 
{ 
    private bool _readOnly = false; 
    public bool ReadOnly 
    { 
     get { return _readOnly; } 
     set { _readOnly = value; } 
    } 

    protected override void DefWndProc(ref Message m) 
    { 
     // If ReadOnly is set to true, then block any messages 
     // to the selection area from the mouse or keyboard. 
     // Let all other messages pass through to the 
     // Windows default implementation of DefWndProc. 
     if (!_readOnly || ((m.Msg <= 0x0200 || m.Msg >= 0x020E) 
     && (m.Msg <= 0x0100 || m.Msg >= 0x0109) 
     && m.Msg != 0x2111 
     && m.Msg != 0x87)) 
     { 
      base.DefWndProc(ref m); 
     } 
    } 
} 
+0

Phép thuật với DefWndProc thật tuyệt vời! +1 – Neolisk

+0

Hoạt động hoàn hảo - Tôi cho rằng bạn sẽ muốn một ReadOnlyListBox mặc định _readOnly thành true, phải không? – Mani5556

1

Tạo một event handler mà loại bỏ tập trung từ Listbox và đăng ký các handler để GotFocus của Listbox biến cố. Bằng cách đó, người dùng sẽ không bao giờ có thể chọn bất kỳ thứ gì trong Listbox. Dòng mã sau đây thực hiện điều đó bằng phương thức ẩn danh nội tuyến:

txtBox.GotFocus + = (object anonSender, EventArgs anonE) => {txtBox.Parent.Focus(); };

* Sửa: Mã giải thích

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