我正在使用DGV来显示包含文本标题作为选项列表的图像列表。他们必须始终是列表中唯一的选择。我无法找到一种方法来阻止用户通过按住Ctrl键单击所选行来清除选择内容。DataGridView总是选中一行
是否有设计师的财产我错过了,可以做到这一点?
如果我必须重写鼠标中的行为,单击事件还有其他方式可以清除当前需要覆盖的选择吗?
我可以采取的第三种方法是不是比我的第二个想法麻烦?
我正在使用DGV来显示包含文本标题作为选项列表的图像列表。他们必须始终是列表中唯一的选择。我无法找到一种方法来阻止用户通过按住Ctrl键单击所选行来清除选择内容。DataGridView总是选中一行
是否有设计师的财产我错过了,可以做到这一点?
如果我必须重写鼠标中的行为,单击事件还有其他方式可以清除当前需要覆盖的选择吗?
我可以采取的第三种方法是不是比我的第二个想法麻烦?
最简单的方法是捕获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
时它会触发)。
DGV获得了一个名为multiselect的属性,如果将其设置为false,则一次只能选择一个单元格/行。
这可以防止选择多行。 IT不会阻止用户控制单击所选行来清除选择。 – 2010-03-16 13:42:54
就处理这样在DataGridView的DataBindingComplete事件:
private void datagridview1_DataBindingComplete(System.Object sender, System.Windows.Forms.DataGridViewBindingCompleteEventArgs e)
{
datagridview1.ClearSelection();
}
请重新阅读我的问题。当网格加载时,您的解决方案将删除所有现有的选择;它不会阻止用户清除选择。 – 2012-04-09 21:44:36
为什么用户总是需要保持一个项目选择?什么样的功能可以启用? – 2010-03-16 13:34:09
您一直需要选择单选按钮的原因相同。我使用的是DGV,因为选择的总数足够大而不会滚动(20种选择×20像素高的图像)。 – 2010-03-16 13:42:04