WindowsフォームアプリケーションでDataGridViewコントロールを使用しています。ユーザーがコントロールを押したまま複数のアイテムを選択すると、正常に機能します。これで、ユーザーがコントロールを放し、クリック(およびマウスの左ボタンを押したまま)してドラッグ操作を開始すると、選択が変更されます。ユーザーがマウスの左ボタンを押したときに選択がクリアされないようにするにはどうすればよいですか?
3 に答える
私はMicrosoftフォーラムでこの答えを見つけました
「複数の行をドラッグアンドドロップするには、DataGridView.MultiSelectをtrueに設定し、DataGridView.DragDropイベントで、DataGridView.SelectedRowsコレクションのすべての行を削除して挿入します。」
このブログエントリは、DataGridViewにドラッグアンドドロップを実装する方法も示しています
ただし、選択の変更は常に別の方法で呼び出されるため、DataGridViewから継承し、これらのマウスイベントをオーバーライドする必要があるように思われます。
- 保護された仮想voidOnCellMouseDown(DataGridViewCellMouseEventArgs e);
- 保護された仮想voidOnCellMouseUp(DataGridViewCellMouseEventArgs e);
次に、OnMouseDownでSelectionChangedイベントをインターセプトし、代わりにOnMouseUpで選択を行うことができます。ドラッグドロップでない場合に正しいアイテムを選択できるように、ダウンロケーションポイントを保持する必要があります。
また、マウスダウンイベントで選択された行のリストを維持する必要があります。それがドラッグドロップイベントに変わった場合は、これらの選択されたすべての行をドラッグして、マウス上で選択します。
また、マウスアップイベントで選択した行のリスト/コピーをクリアすることを忘れないでください。
良い質問。これはあなたが望んでいたほど単純な答えではないかもしれませんが、問題を解決する方法についての良い洞察を与えるはずです: http://www.codeproject.com/KB/cpp/DataGridView_Drag- n-Drop.aspx
うまくいくテクニックを見つけました。最後のセルを (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;
}