DataGridView始终选择一行

Dan*_*ely 7 c# datagridview winforms

我正在使用DGV显示带有文本标题的图像列表作为选项列表.它们必须始终是列表中的唯一选择.我无法找到一种方法来阻止用户通过按住Control键单击所选行来清除选择.

我失踪的设计师有没有可以做到这一点的财产?

如果我必须覆盖鼠标单击事件中的行为,还有其他方法可以清除当前需要覆盖的选择吗?

我能采取的第三种方法是否比我的第二种想法更简单?

Dan*_*ach 2

最简单的方法是捕获该SelectionChanged事件并检查用户是否已取消选择所有行。如果是这样,请重新选择先前选择的行。本质上,您正在拦截他们的操作并将选择切换回来。像这样的东西(代码未经测试,但你会明白的):

    DataGridViewRow last_selected_row;
    private void dgv_SelectionChanged(object sender, EventArgs e)
    {
            if (dgv.SelectedRows.Count == 0) 
                    last_selected_row.Selected = true;
            else
                    last_selected_row = dgv.SelectedRows[0];
    }
Run Code Online (Sandbox Code Playgroud)

根据您的应用程序,存储行索引可能比存储对行本身的引用更好。另外,请务必初始化 last_selected_row 并在删除任何行时更新它。

挂钩该事件的任何其他控件SelectionChanged都需要安全地处理未选择任何行的情况,以防它们在将其切换回的事件之前触发。不过,他们可以立即返回,因为知道SelectionChanged会立即再次开火,这是安全的。

您还可以子类化DataGridView并重写该OnSelectionChanged方法。然后您可以在事件触发之前重新选择最后选定的行(当您调用 时它将触发base.OnSelectionChanged)。