2010-03-05 80 views
1

我想实现一个的ListView将有SelectedItems列表,因为它有现在, 但它也将有一个单独的项目是在光标下(可用鼠标/键盘移动)。 项目选择将通过特殊的操作完成(例如空格键)。独立于的WinForms ListView的“所选项目”和“重点项目”

换句话说,我想抑制对的ListView选择和只改变FocusedItem时,通常会出现选择。

我觉得我应该做点什么的ListViewFocusedItemSelectedItems性质, 但问题是,单击某个项目选择它(也改变焦点)。

的溶液。将捕获KEYDOWN鼠标点击事件可以根据鼠标点击事件(项目下的鼠标指针和项以上发生变化的选择和仅改变FocusedItem到物品/低于当前一个在keydown上/下箭头)。然后,我只会将项目添加到SelectedItems收藏在我的特殊事件(空间按键)上。

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

+0

一个ListView与复选框是一个更传统的方式来处理持久性选择。 – Grammarian 2010-03-07 22:04:56

回答

0

好的,从头开始。我需要子类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; 
    } 
} 
+0

其他一些需要考虑的事项:PageUp/PageDown也会改变选择;在列表中键入也会改变选择;重点项目可以为空。 – Grammarian 2010-03-07 22:18:55

+0

也是家/结束,我还必须处理shift + home,shift + end,shift + up,shift + down,ctrl + click等。 – Axarydax 2010-03-08 14:56:59