2010-01-17 79 views
1

我試圖阻止在匹配指定條件的列表框中選擇項目。經過一些MSDN研究後,我開始知道LBN_SELCHANGE是通過WM_COMMAND發送給它的父窗口的,所以我試圖用 鉤住OnNotifyMessage列表框發送的LBN_SELCHANGE消息,如下所示。列表框通知消息

public class SimpleListBox:ListBox 
{ 
    public SimpleListBox() 
    { 
     SetStyle(ControlStyles.EnableNotifyMessage, true); 
    } 
    private const int LBN_SELCANCEL = 0x3; 
    private const int LBN_SELCHANGE = 0x1; 
    protected override void OnNotifyMessage(Message m) 
    { 
     switch (m.Msg) 
     { 
      ////http://msdn.microsoft.com/en-us/library/bb775161(VS.85).aspx 
      case (int)WindowsMessages.WM_COMMAND: //0x111 
       if (((int)m.WParam).LoWord() == LBN_SELCHANGE) 
       { 
        int i = 0; 
       } 
       break; 
     } 
     base.OnNotifyMessage(m); 
    } 

} 

但這似乎不工作,請指導我,如果我錯過了什麼。 在此先感謝。

回答

2

是的,那是行不通的。在完成契約後發送LBN_SELCHANGE,該項目已被選中。你只能取消選擇它。

您可以在不捕獲Windows消息的情況下執行此操作。這是一個愚蠢的例子,只允許選擇偶數項:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     listBox1.SelectionMode = SelectionMode.MultiSimple; 
     listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged); 
    } 

    void listBox1_SelectedIndexChanged(object sender, EventArgs e) { 
     for (int ix = listBox1.SelectedIndices.Count - 1; ix >= 0; --ix) { 
     int index = listBox1.SelectedIndices[ix]; 
     if (index % 2 != 0) listBox1.SelectedIndices.Remove(index); 
     } 
    } 
    } 

不可迴避的問題是,當它是由用戶選擇和你的程序未選擇的選擇閃爍。如果不需要,您應該查看CheckedListBox控件。

+0

這樣做,謝謝。 我只是想知道。如果我在 「case(int)WindowsMessages.WM_COMMAND:// 0x111」上設置斷點。斷點不會觸發。你有什麼線索爲什麼這不起作用。 再次感謝 – crypted 2010-01-18 07:41:45

+1

使用WndProc()。家長通知消息通過向消息添加0x2000反映回控制。 – 2010-01-18 08:54:03

+0

太棒了,這就是我想要的。謝謝。 – crypted 2010-01-18 12:15:20