2008-10-09 77 views
4

我在Windows窗體應用程序中使用DataGridView控件。當用戶按住控件選擇多個項目時,它可以正常工作。現在,當用戶釋放控件並單擊(並按住鼠標左鍵)以開始拖動操作時,選擇將改變。當用戶按住鼠標左鍵時,如何停止選擇清除?DataGridView鼠標選擇

回答

3

我發現這個答案在Microsoft Forum

「爲了拖放多行,將DataGridView.MultiSelect設置爲true,並在DataGridView.DragDrop事件中,刪除並插入DataGridView.SelectedRows集合中的所有行。」

blog entry還展示瞭如何實現拖動和一個DataGridView


下降,但在我看來,你將不得不從DataGridView中繼承並重寫這些鼠標事件作爲選擇的變化總是會得到否則稱呼。

  • 保護虛擬無效 OnCellMouseDown(DataGridViewCellMouseEventArgs E);
  • protected virtual void OnCellMouseUp(DataGridViewCellMouseEventArgs e);

然後,您可以攔截OnMouseDown中的SelectionChanged事件,並在OnMouseUp中進行選擇。你將不得不保留下來的位置點,這樣你可以選擇正確的項目,如果它不是一個拖放。

您還必須在鼠標向下事件中維護所選行的列表,並且如果它變成拖放事件,則拖動所有這些選定行並在鼠標上向上選擇它們。

並且不要忘記在鼠標向上事件中清除所選行的列表/副本。

1

好問題。雖然這可能不是那麼簡單,因爲你可能一直希望的答案,它應該給你如何去解決你的問題的一些很好的啓示: http://www.codeproject.com/KB/cpp/DataGridView_Drag-n-Drop.aspx

+0

我昨天看到那篇文章...我希望在「單擊」而不是「鼠標按下」時發生選擇, 。我已經實現了拖放功能,但我只是試圖修復它,以便用戶在拖動之前選擇最後一個項目時不必按住鼠標按鈕... – joek1975 2008-10-10 14:59:19

0

我發現了一種有用的技術。在選擇最後一個單元格後(使用Ctrl或Shift鍵),在釋放鼠標鍵之前開始拖動,選擇內容不會改變。然後在下拉列表中,您可以使用以下方法獲取所選單元格的列表:

private SC.ArrayList selectedCells() 
    { 
     SC.ArrayList cellsList = new SC.ArrayList(); 
     Int32 selectedCellCount = dataViewImages.GetCellCount(DataGridViewElementStates.Selected); 
     if (selectedCellCount > 0) 
     { 
     for (int i = 0;i < selectedCellCount; i++) { 
      int cell = dataViewImages.SelectedCells[i].RowIndex*ShowImages.NumColumnsForWidth() + dataViewImages.SelectedCells[i].ColumnIndex; 
      cellsList.Add(cell); 
     } 
     cellsList.Sort(); 
     return cellsList; 
     } 
     else 
     return null; 
    }