禁止用户选择不是彼此相邻的多行?

时间:2012-10-01 15:24:43

标签: c# datagridview

DataGridView中,用户可以通过按住控件并选择不同的行来选择彼此不相邻的多行。我的问题有两个部分。

首先,默认情况下保持控制是用户可以选择多个不相邻的行的唯一方式吗?其次,如何禁用此行为?

3 个答案:

答案 0 :(得分:3)

  

首先,默认情况下控制是用户可以的唯一方式   选择多个彼此不相邻的行?

不,你可以通过实施Events以自己的方式拥有它。这些链接可以帮助您实现所需目标:thisthis

  

其次,如何禁用此行为?

禁用ctrl +单击,以便用户无法选择彼此分开的多个单元格,行或列。您可以通过覆盖OnMouseDown事件来完成此操作。显然,为此你必须自己去(datagridview继承)控件。在那里通过..覆盖OnMouseDown事件。

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

希望它有所帮助。

答案 1 :(得分:1)

使用multiSellect这样的属性

multiSelect=false

答案 2 :(得分: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);
           }
     }

}