4

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

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

4

3 回答 3

3

首先,默认情况下保持控制是用户可以像这样选择多个彼此不相邻的行的唯一方法吗?

不,您可以通过实现Events. 这些链接可以帮助您实现您想要的:thisthis

其次,如何禁用这种行为?

禁用 ctrl+click 以使用户无法选择多个彼此分开的单元格、行或列。您可以通过覆盖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 回答