2010-03-16 86 views
7

我正在使用DGV来显示包含文本标题作为选项列表的图像列表。他们必须始终是列表中唯一的选择。我无法找到一种方法来阻止用户通过按住Ctrl键单击所选行来清除选择内容。DataGridView总是选中一行

是否有设计师的财产我错过了,可以做到这一点?

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

我可以采取的第三种方法是不是比我的第二个想法麻烦?

+0

为什么用户总是需要保持一个项目选择?什么样的功能可以启用? – 2010-03-16 13:34:09

+0

您一直需要选择单选按钮的原因相同。我使用的是DGV,因为选择的总数足够大而不会滚动(20种选择×20像素高的图像)。 – 2010-03-16 13:42:04

回答

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时它会触发)。

0

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

+1

这可以防止选择多行。 IT不会阻止用户控制单击所选行来清除选择。 – 2010-03-16 13:42:54

0

就处理这样在DataGridView的DataBindingComplete事件:

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

{ 
datagridview1.ClearSelection(); 
} 
+0

请重新阅读我的问题。当网格加载时,您的解决方案将删除所有现有的选择;它不会阻止用户清除选择。 – 2012-04-09 21:44:36