【问题标题】:DataGridView select RowHeader or ColumnHeaderDataGridView 选择 RowHeader 或 ColumnHeader
【发布时间】:2023-03-07 22:04:01
【问题描述】:

我正在尝试实现一个 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);
    }
}

【问题讨论】:

  • 你能分享你的代码吗?你用的是winforms的DataGridView吗?
  • 嗨 Ryan,我正在使用 Winforms,并且我已经编辑了我的原始帖子以包含我拥有的小代码(与这个问题相关)

标签: c# winforms


【解决方案1】:

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

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

【讨论】:

  • 为什么不直接使用dgv.Rows[e.RowIndex].Selected = true; 等?无需单独获取每个单元格。
  • @RyanFrame 不适用于SelectionMode = CellSelect,我假设 OP 正试图使网格更像电子表格。
  • @LarsTech 你是对的,我试图让网格像电子表格一样。我会试试你的建议。谢谢!
【解决方案2】:

在这里聚会迟到了,但无需手动执行此操作(即循环遍历整个 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 标题之前的第一次单击将无法正常工作。

C#:

private void dgvView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    {
        var withBlock = dgvView;
        if (withBlock.SelectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
        {
            withBlock.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
            withBlock.Columns(e.ColumnIndex).Selected = true;
        }
    }
}

private void dgvView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    {
        var withBlock = dgvView;
        if (withBlock.SelectionMode != DataGridViewSelectionMode.RowHeaderSelect)
        {
            withBlock.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
            withBlock.Rows(e.RowIndex).Selected = true;
        }
    }
}

VB.NET:

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

【讨论】:

  • 这个答案看起来很有帮助,但这似乎不是 C#(请参阅问题标签)。
  • 已编辑答案以显示 C# 和 VB.NET 解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多