2010-03-05 67 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