4

ユーザーは、DataGridViewコントロールを押しながら別の行を選択することで、互いに隣接していない複数の行を選択できます。私の質問は2つの部分に分かれています。

まず、デフォルトでコントロールを保持することは、ユーザーがこのように互いに隣接していない複数の行を選択できる唯一の方法ですか?次に、この動作を無効にするにはどうすればよいでしょうか。

4

3 に答える 3

3

まず、デフォルトでコントロールを保持することは、ユーザーがこのように互いに隣接していない複数の行を選択できる唯一の方法ですか?

いいえ、を実装することで、独自の方法でそれを使用できますEvents。これらのリンクは、あなたが望むものを達成するのに役立つかもしれません:これこれ

次に、この動作を無効にするにはどうすればよいでしょうか。

Ctrlキーを押しながらクリックを無効にして、ユーザーが互いに離れている複数のセル、行、または列を選択できないようにします。これを行うには、イベントをオーバーライドしますOnMouseDown。明らかに、このためには、独自の(datagridview継承された)制御を行う必要があります。OnMouseDownその中でイベント をオーバーライドします。

 protected override void OnMouseDown(MouseEventArgs e)
    {
        if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
        {
        }
        else
        {
            base.OnMouseDown(e);
        }
    }     

それが役に立てば幸い。

于 2012-10-01T16:58:05.990 に答える
1

multiSellectこのようなプロパティを使用する

multiSelect=false

于 2012-10-01T15:48:49.500 に答える
0

カスタムデータグリッドを派生させる必要なしに、選択された行インデックスを追跡し、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);
           }
     }

}

于 2012-10-01T17:03:03.397 に答える