独立于的WinForms ListView的“所选项目”和“重点项目”
我想实现一个的ListView将有SelectedItems列表,因为它有现在, 但它也将有一个单独的项目是在光标下(可用鼠标/键盘移动)。 项目选择将通过特殊的操作完成(例如空格键)。独立于的WinForms ListView的“所选项目”和“重点项目”
换句话说,我想抑制对的ListView选择和只改变FocusedItem时,通常会出现选择。
我觉得我应该做点什么的ListView的FocusedItem和SelectedItems性质, 但问题是,单击某个项目选择它(也改变焦点)。
的溶液。将捕获KEYDOWN和鼠标点击事件可以根据鼠标点击事件(项目下的鼠标指针和项以上发生变化的选择和仅改变FocusedItem到物品/低于当前一个在keydown上/下箭头)。然后,我只会将项目添加到SelectedItems收藏在我的特殊事件(空间按键)上。
我在问的是,如果有更多的优雅的方法来解决这个问题,或者上面的解决方案尽可能简单。谢谢
好的,从头开始。我需要子类ListView(ListViewEx);
手柄键盘选择事件:在WndProc中
这样左键点击/键盘向上/向下移动对焦和键盘鼠标右键
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;
}
}
}
和鼠标事件使得选择
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也会改变选择;在列表中键入也会改变选择;重点项目可以为空。 – Grammarian 2010-03-07 22:18:55
也是家/结束,我还必须处理shift + home,shift + end,shift + up,shift + down,ctrl + click等。 – Axarydax 2010-03-08 14:56:59
一个ListView与复选框是一个更传统的方式来处理持久性选择。 – Grammarian 2010-03-07 22:04:56