DataGridView始终选择一行

时间:2010-03-16 12:49:44

标签: c# winforms datagridview

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

我失踪的设计师是否有可以做到这一点的属性?

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

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

3 个答案:

答案 0 :(得分: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];
    }

根据您的应用程序,最好存储行索引而不是对行本身的引用。另外一定要初始化last_selected_row并在删除任何行时更新它。

挂钩SelectionChanged事件的任何其他控件都需要安全地处理没有选择行的情况,以防它们在切换回事件之前触发。他们可以立即回来,安全地知道SelectionChanged会暂时再次发射。

您也可以继承DataGridView并覆盖OnSelectionChanged方法。然后你可以在事件触发之前重新选择最后选择的行(当你调用base.OnSelectionChanged时它会触发)。

答案 1 :(得分:0)

DGV获得了一个名为multiselect的属性,如果将其设置为false,则一次只能选择一个单元格/行。

答案 2 :(得分:0)

只需处理datagridview的DataBindingComplete事件,如下所示:

private void datagridview1_DataBindingComplete(System.Object sender, System.Windows.Forms.DataGridViewBindingCompleteEventArgs e)

{
datagridview1.ClearSelection();
}