ユーザーは、DataGridView
コントロールを押しながら別の行を選択することで、互いに隣接していない複数の行を選択できます。私の質問は2つの部分に分かれています。
まず、デフォルトでコントロールを保持することは、ユーザーがこのように互いに隣接していない複数の行を選択できる唯一の方法ですか?次に、この動作を無効にするにはどうすればよいでしょうか。
ユーザーは、DataGridView
コントロールを押しながら別の行を選択することで、互いに隣接していない複数の行を選択できます。私の質問は2つの部分に分かれています。
まず、デフォルトでコントロールを保持することは、ユーザーがこのように互いに隣接していない複数の行を選択できる唯一の方法ですか?次に、この動作を無効にするにはどうすればよいでしょうか。
まず、デフォルトでコントロールを保持することは、ユーザーがこのように互いに隣接していない複数の行を選択できる唯一の方法ですか?
いいえ、を実装することで、独自の方法でそれを使用できますEvents
。これらのリンクは、あなたが望むものを達成するのに役立つかもしれません:これとこれ。
次に、この動作を無効にするにはどうすればよいでしょうか。
Ctrlキーを押しながらクリックを無効にして、ユーザーが互いに離れている複数のセル、行、または列を選択できないようにします。これを行うには、イベントをオーバーライドしますOnMouseDown
。明らかに、このためには、独自の(datagridview継承された)制御を行う必要があります。OnMouseDown
その中でイベント をオーバーライドします。
protected override void OnMouseDown(MouseEventArgs e)
{
if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
{
}
else
{
base.OnMouseDown(e);
}
}
それが役に立てば幸い。
multiSellect
このようなプロパティを使用する
multiSelect=false
カスタムデータグリッドを派生させる必要なしに、選択された行インデックスを追跡し、RowStateChangedイベントで無効な場合は行の選択を解除できる場合があります。これは、全行の選択を前提としています。
また、行の選択解除に検証ロジックを追加して、隣接する行にギャップが生じないようにする必要があります。たとえば、行1、2、3が選択され、次に行2が選択解除されるため、これを禁止するか、行3または行1の選択を解除するかを決定する必要があります。
public List<int> selectedIndexes = new List<int>();
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
if (e.StateChanged == DataGridViewElementStates.Selected)
{
//selected
if (e.Row.Selected)
{
int newRowIndex = e.Row.Index;
//if other rows selected make sure adjacent selection exists
if (selectedIndexes.Count() > 0)
{
if (selectedIndexes.Contains(newRowIndex - 1) || selectedIndexes.Contains(newRowIndex + 1))
{
//allow selection
selectedIndexes.Add(newRowIndex);
}
else
{
//cancel selection
e.Row.Selected = false;
}
}
else
{
//first selection so allow it
selectedIndexes.Add(newRowIndex);
}
}
else if( !e.Row.Selected)
{
//row deselected (need to add logic to remove non adjacent rows to be unselected as well)
selectedIndexes.Remove(e.Row.Index);
}
}
}