当用户单击另一行中的单元格时,有没有办法保持选择DataGridView行?

时间:2011-02-08 03:54:13

标签: c# .net winforms datagridview

DataGridView控件允许您单击行标题并选择行(整行突出显示),或使用鼠标单击并拖动以选择多行等,以选择所有行。

无论如何,如果用户决定点击DataGridView中的某个单元格,我需要保持选中的行。因此,如果用户单击其中一个选定行中的单元格,则所选行应保持突出显示。如果用户单击其他未选定行中的单元格,则所有当前选定的单元格应保持突出显示。事实上,我不希望行选择 at all ,除非他们使用行标题。

这是容易配置的东西,还是我进行了几天的黑客攻击?

3 个答案:

答案 0 :(得分:2)

我会说它不是一个好主意对于这个以及从用户角度来看它的不受欢迎的行为,你需要告诉他们你的行只能通过行标题而不是点击它们来选择(相信我会沮丧的。)在某种程度上,您要阻止用户选择行。

那就是说,如果你热衷于继续这个设计,那么你需要自己动手。 GridView没有任何构建的行为。您可以使用RowChanged事件和CanSelect属性&做一些压倒一切。

然后有一个RowHeaderMouseClick事件可以用于行标题行选择。

答案 1 :(得分:2)

配置不容易。使用DataGridView控件花几天时间,您会注意到 nothing 关于它的配置很容易,除非开发人员碰巧决定将其作为属性公开。只有最简单的事情才会暴露出来,所以不要浪费太多时间。

当然, 是可能的。我花费了太多的时间来对DataGridView控件进行子类化,并重写内置的行为,这些行为让我感到愚蠢。但我真的不推荐给任何人。

更重要的是,您还应该认真地重新考虑您是否想要进行此特定更改。如果软件开始这样做,我不知道发生了什么。我立即怀疑我的换档键或鼠标按钮卡住了,试着敲打它们。下一步是重新启动计算机。总的来说,用户体验不是很好。这不是控件因某种原因而表现的方式。请仔细考虑语义对于要突出显示的单元格的实际含义 - 通常,这意味着您可以一次更改所有选定单元格的值或删除所有选定单元格。如果你的实现如何运作,你可能不应该首先这样做。

答案 2 :(得分:1)

我设法绕过这个,呃... DataGridView子类化,对不起。

这可以干净利落地完成,在取消选择它们的内部机制之前和之后添加几个委托:

class SimpleDataGridView : DataGridView {

    public Action<DataGridViewCellMouseEventArgs> BeforeCellMouseDown;
    public Action<DataGridViewCellMouseEventArgs> AfterCellMouseDown;

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) {
        if(BeforeCellMouseDown != null)
            BeforeCellMouseDown(e);

        base.OnCellMouseDown(e);

        if(AfterCellMouseDown != null)
            AfterCellMouseDown(e);
    }
}

然后,您可以在构造函数中以这种方式使用它。替换&#34; yourCondition&#34;顺便说一句,你想确定选择是否必须保留。

IEnumerable<DataGridViewRow> sel = null;

dataGridView1.BeforeCellMouseDown = 
    e => {
        if (yourCondition)
            sel = dataGridView1.SelectedRows.OfType<DataGridViewRow>();
        else
            sel = null;
    };

dataGridView1.AfterCellMouseDown = 
    e => {
        if(sel != null) {
            foreach(var row in sel)
                row.Selected = true;
        }
    };