c# - 始终选中一行的 DataGridView

标签 c# winforms datagridview

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

我缺少的设计器中是否有可以执行此操作的属性?

如果我必须覆盖鼠标点击事件中的行为,是否还有其他方法可以让用户清除需要涵盖的当前选择?

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

最佳答案

最简单的方法是捕获 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];
    }

根据您的应用程序,存储行索引而不是对行本身的引用可能更好。如果删除任何行,请务必初始化 last_selected_row 并更新它。

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

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

关于c# - 始终选中一行的 DataGridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454396/

相关文章:

c# - 我如何(优雅地)将文本框转置到字符串特定部分的标签上?

c# - 如何从 C# 中的资源文件设置面板的背景图像?

c# - 如何在更大的文本框中编辑 DataGridView 文本单元格

c# - 无法隐藏 datagridview 中的第一列?

c# - 通过代码打开机器/基地Web.Config(64位)

c# - 删除特定 API 调用的授权规则

c# - Azure 应用服务 File.ReadAllText 返回文件未找到异常,但文件存在于该位置

C# 性能异常案例

c# - WPF 未出现在 WinForms 的 ElementHost 内

vb.net - 如何在排序时保留 DataGridView 的编程彩色背景