【问题标题】:Separate 'selected items' and 'focused item' in WinForms ListView在 WinForms ListView 中分离“选定项目”和“焦点项目”
【发布时间】:2010-03-05 14:39:27
【问题描述】:

我想实现一个 ListView,它会像现在一样拥有一个 SelectedItems 列表, 但它也会在光标下有一个单独的项目(可使用鼠标/键盘移动)。 项目选择将通过特殊操作(例如空格键)完成。

换句话说,我想抑制 ListView 上的选择,并且仅在正常发生选择时更改 FocusedItem

我认为我应该对 ListViewFocusedItemSelectedItems 属性做点什么, 但问题是点击一个项目会选择它(也会改变焦点)。

一种解决方案是捕获 keydownmouseclick 事件,这些事件可以更改选择并仅根据事件将 FocusedItem 更改为项目( mouseclick 中鼠标指针下方的项目和 keydown 上/下箭头中当前项目上方/下方的项目)。然后我只会在我的特殊事件(空格键按下)中将项目添加到 SelectedItems 集合中。

我要问的是,是否有更优雅的方法来解决这个问题,或者上面的解决方案是否尽可能简单。谢谢

【问题讨论】:

  • 带有复选框的 ListView 是一种更传统的方式来处理持久选择。

标签: winforms listview focus


【解决方案1】:

好的,从这里开始。

我需要继承 ListView (ListViewEx);

处理键盘选择事件:

private void ListViewEx_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Down)
{
    //move focus down
    if (this.FocusedItem.Index + 1 < this.Items.Count)
    {
        this.FocusedItem = this.Items[this.FocusedItem.Index + 1];
        this.FocusedItem.EnsureVisible();
        e.Handled = true;
    }
}
else if (e.KeyData == Keys.Up)
{
    if (this.FocusedItem.Index - 1 < this.Items.Count)
    {
        this.FocusedItem = this.Items[this.FocusedItem.Index - 1];
        this.FocusedItem.EnsureVisible();
        e.Handled = true;
    }
}
}

WndProc 中的鼠标事件

这样左键单击/键盘上/下移动焦点,键盘右键单击进行选择

protected override void WndProc(ref Message m)
{
    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_RBUTTONDOWN = 0x204;
    switch (m.Msg)
    {
        case WM_LBUTTONDOWN:
            Point pos = this.PointToClient(Cursor.Position);
            var item = GetItemAt(pos.X, pos.Y);
            this.FocusedItem = item;
            break;
        case WM_RBUTTONDOWN:
            pos = this.PointToClient(Cursor.Position);
            item = GetItemAt(pos.X, pos.Y);
            item.Selected = !item.Selected;
            break;
        default:
            base.WndProc(ref m);
            break;
    }
}

【讨论】:

  • 其他一些需要考虑的事情:PageUp/PageDown 也改变了选择;在列表中输入也会改变选择;重点项目可以为空。
  • 也是 home/end,我还必须处理 shift+home、shift+end、shift+up、shift+down、ctrl+click 等。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2018-09-18
相关资源
最近更新 更多