代码之家  ›  专栏  ›  技术社区  ›  rory.ap

如何在系统中保持选中的其他项目。窗户。形式。取消选择一个项目时的ListView

  •  1
  • rory.ap  · 技术社区  · 6 年前

    当您在中选择了多个项目时 ListView 然后单击其中一个选定项目,默认行为是取消选择所有其他项目,只保留已单击的项目。我想要完全相反的行为:单击其中一个选定的项目将仅取消选择该项目,而保留其他选定项目。

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

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

    上面的事件处理程序仅对单击的单个项目激发,而不是对正在取消选择的其他所有项目激发。

    有没有办法做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Reza Aghaei    6 年前

    作为一个选项,您可以覆盖 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);
            }
        }
    }