在DataGridView
中,用户可以通过按住控件并选择不同的行来选择彼此不相邻的多行。我的问题有两个部分。
首先,默认情况下保持控制是用户可以选择多个不相邻的行的唯一方式吗?其次,如何禁用此行为?
答案 0 :(得分:3)
首先,默认情况下控制是用户可以的唯一方式 选择多个彼此不相邻的行?
不,你可以通过实施Events
以自己的方式拥有它。这些链接可以帮助您实现所需目标:this和this。
其次,如何禁用此行为?
禁用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);
}
}
}