我有一个DataGridView,并且只允许选择一列。
为此,我在CellClick
事件中检查了所选单元格的ColumnHeader
是否匹配,如果不匹配,我将清除选择。
但是,我要使其返回到先前选择的单元格(如果他们在错误的列中选择了一个单元格)。我怎样才能做到这一点?
我尝试存储选定的单元格对象,但是那样行不通,因为CellClick
事件触发时,选定的单元格对象将更改。
此外,由于某些原因,每次单击错误的单元格时,我的选择都不起作用,尤其是如果单击速度很快,错误的单元格仍将保持选中状态,为您的信息添加了DataGridView CellClick
事件在运行时动态地变化,并且有多个DataGridView控件。
我的代码我无法提供填充DataGridView的方式,因为它确实很长。
private void Form1_Load(object sender, EventArgs e)
{
DGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);
}
void DGV_CellClick(Object sender, EventArgs e)
{
DataGridView dgv = (DataGridView)sender;
// DataGridViewCell Selectedcell = dgv.SelectedCells[0];
if (!dgv.Columns[dgv.SelectedCells[0].ColumnIndex].HeaderText.Contains("SCORE"))
dgv.ClearSelection();
}
答案 0 :(得分:0)
由于只启用了一个列,因此可以使用SelectionChanged事件来确定DataGridView.CurrentCell是否属于已启用的列,以及是否未将CurrentCell
设置为当前行中启用的列:
int dgvEnabledColumn = 1;
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
var dgv = sender as DataGridView;
var currentCell = dgv.CurrentCell;
if (currentCell.ColumnIndex != dgvEnabledColumn )
{
dgv.CurrentCell = dgv[dgvEnabledColumn, currentCell.RowIndex];
}
}
您可以使用列的集合来扩展启用的列的选择(将当前单元格设置为最近/上一个/下一个列)。
例如,使用DataGridViewColumn
对象的集合,确定“当前”单元格是否已启用,如果未启用,则将“当前”单元格设置为最近的下一个启用的列(如果有)或最接近的上一个列:
List<DataGridViewColumn>
可以在初始化DataGridView之后填充:
enabledColumns = new List<DataGridViewColumn>()
{
dataGridView1.Columns[0],
dataGridView1.Columns[2]
};
List<DataGridViewColumn> enabledColumns = null;
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (enabledColumns is null) return;
var dgv = sender as DataGridView;
var currentCell = dgv.CurrentCell;
if (!enabledColumns.Any(c => c.Index == currentCell.ColumnIndex))
{
var nextCol = enabledColumns.FirstOrDefault(c => c.Index > currentCell.ColumnIndex);
if (nextCol != null) {
dgv.CurrentCell = dgv[nextCol.Index, currentCell.RowIndex];
}
else
{
var previousCol = enabledColumns.First(c => c.Index < currentCell.ColumnIndex);
dgv.CurrentCell = dgv[previousCol.Index, currentCell.RowIndex];
}
}
}