取消选择一个项目时,如何在System.Windows.Forms.ListView中保留其他项目

时间:2018-02-21 12:45:00

标签: c# .net winforms listview multipleselection

如果在ListView中选择了多个项目并单击其中一个选定项目,则默认行为是取消选中所有其他项目,只保留选中的项目。我喜欢完全相反的行为:单击其中一个选定的项目会取消选择该项目并保留其他项目。

我看过像this onethis one这样的答案。第一个是谈论防止鼠标点击做任何我不想要的事情,第二个是关于取消索引更改事件。我尝试根据自己的需要调整后者,但仍会导致其他项目被取消选择。

private void HandleIncludableFilesListViewSelectedIndexChanging
    (object sender, Controls.Events.ListViewItemChangingEventArgs e)
{
   if (_includableFilesListView.Items[e.Index].Selected) e.Cancel = true;
}

上述事件处理程序仅针对单击的单个项目触发,而不会触发所有其他项目,因为它们被取消选择。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

作为选项,您可以覆盖DefWndProc并处理WM_LBUTTONDOWN。然后执行命中测试并检查点击的点是否为项目,还原项目的Selected属性:

public class MyListView : ListView
{
    const int WM_LBUTTONDOWN = 0x0201;
    protected override void DefWndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDOWN)
        {
            int x = (m.LParam.ToInt32() & 0xffff);
            int y = (m.LParam.ToInt32() >> 16) & 0xffff;
            var item = this.HitTest(x, y).Item;
            if (item != null)
                item.Selected = !item.Selected;
            else
                base.DefWndProc(ref m);
        }
        else
        {
            base.DefWndProc(ref m);
        }
    }
}