4

我正在尝试实现一个 DataGridView,它允许通过单击行标题来选择整行或通过单击列标题来选择整列。

我尝试覆盖 OnColumnHeaderMouseClick 函数并手动选择列。这仅在我在事件发生之前将 SelectionMode 设置为 ColumnHeaderSelect 时才有效。

任何有关如何获得此行为的帮助将不胜感激!

这是我的 DataGridView 中的相关代码:

public class CustomDataGridView : DataGridView
{
    protected override void OnRowHeaderMouseClick(DataGridViewCellMouseEventArgs e)
    {
        this.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
        base.OnRowHeaderMouseClick(e);
    }

    protected override void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e)
    {
        this.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
        base.OnColumnHeaderMouseClick(e);
    }
}
4

2 回答 2

3

我认为您必须手动执行此操作:

protected override void OnRowHeaderMouseClick(DataGridViewCellMouseEventArgs e) {
  this.ClearSelection();
  for (int i = 0; i < this.Columns.Count; ++i) {
    this.Rows[e.RowIndex].Cells[i].Selected = true;
  }
  base.OnRowHeaderMouseClick(e);
}

protected override void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e) {
  this.ClearSelection();
  for (int i = 0; i < this.Rows.Count; ++i) {
    this.Rows[i].Cells[e.ColumnIndex].Selected = true;
  }
  base.OnColumnHeaderMouseClick(e);      
}

确保SelectionMode = CellSelect

于 2013-03-26T21:16:50.870 回答
1

在这里聚会迟到了,但没有必要手动执行此操作(即循环遍历整个 dgv)。

OP 非常接近您的需要。只需捕获 Columns 和 Rows 的 Header Click 事件并相应地设置 SelectionMode。然后强行选择他们单击的任何列/行。

这使它的功能就像 Excel 电子表格一样,您可以在其中单独选择单元格,或通过单击标题选择整个列/行。您还可以通过按住 Shift/Ctrl 选择多个列/行。它还允许对整个列/行进行 Shift-Space 选择(取决于您所处的模式)。这类似于 Excel,除了 Excel 允许不同的功能:Shift-Space 选择行和 Ctrl-Space 选择列,但是嘿......我们不能拥有它。

只需确保 dgv 的初始 SelectionMode 是 Column/RowHeaderSelect 或 CellSelect,而不是 FullColumn/RowSelect,否则他们在单击 Column/Row 标题之前的第一次单击将无法正常工作。

Private Sub dgvView_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvView.ColumnHeaderMouseClick
    With dgvView
        If .SelectionMode <> DataGridViewSelectionMode.ColumnHeaderSelect Then
            .SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect
            .Columns(e.ColumnIndex).Selected = True
        End If
    End With
End Sub
Private Sub dgvView_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvView.RowHeaderMouseClick
    With dgvView
        If .SelectionMode <> DataGridViewSelectionMode.RowHeaderSelect Then
            .SelectionMode = DataGridViewSelectionMode.RowHeaderSelect
            .Rows(e.RowIndex).Selected = True
        End If
    End With
End Sub
于 2018-03-06T22:34:21.617 回答