在 aDataGridView
中,用户可以通过按住控件并选择不同的行来选择多个彼此不相邻的行。我的问题有两个部分。
首先,默认情况下保持控制是用户可以像这样选择多个彼此不相邻的行的唯一方法吗?其次,如何禁用这种行为?
在 aDataGridView
中,用户可以通过按住控件并选择不同的行来选择多个彼此不相邻的行。我的问题有两个部分。
首先,默认情况下保持控制是用户可以像这样选择多个彼此不相邻的行的唯一方法吗?其次,如何禁用这种行为?
首先,默认情况下保持控制是用户可以像这样选择多个彼此不相邻的行的唯一方法吗?
不,您可以通过实现Events
. 这些链接可以帮助您实现您想要的:this和this。
其次,如何禁用这种行为?
禁用 ctrl+click 以使用户无法选择多个彼此分开的单元格、行或列。您可以通过覆盖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);
}
}
}