列表框通知消息

时间:2010-01-17 10:13:34

标签: c#

我正在尝试阻止在列表框中选择与指定条件匹配的项目。经过一些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);
    }

}

但这似乎不起作用,如果我错过了什么,请指导我。 提前谢谢。

1 个答案:

答案 0 :(得分: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控件。