【问题标题】:Group rows in DataGridView在 DataGridView 中对行进行分组
【发布时间】:2014-06-30 09:25:40
【问题描述】:

我想在 Windows 窗体上对 DataGridView 中具有相同名称的行进行分组,下面是我想要实现的图像。

是否可以在不使用任何第三方工具的情况下实现以下功能?

【问题讨论】:

  • 不,使用标准控件无法轻松做到这一点。
  • @Killercam:是的,我也没有找到任何解决方案。

标签: c# winforms datagridview


【解决方案1】:

在DataGridView中放置以下代码

dgvProduct_CellFormatting Event

If e.RowIndex > 0 And e.ColumnIndex = 0 Then
                If dgvProduct.Item(0, e.RowIndex - 1).Value = e.Value Then
                    e.Value = ""
                ElseIf e.RowIndex < dgvProduct.Rows.Count - 1 Then
                    dgvProduct.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.White
                End If
End If

全部完成!

享受

【讨论】:

    【解决方案2】:

    您可以尝试使用 MSFlexGrid 的 MergeCells 垂直单元格合并属性的功能,而不是本文 DataGridView Grouping in C#/VB.NET: Two Recipes 中解释的行分组。在此示例中,属于组的行使用垂直合并的单元格在视觉上连接 - 而不是使用经典的水平组行。

    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs args)
    {
      base.OnCellPainting(args);
    
      args.AdvancedBorderStyle.Bottom =
        DataGridViewAdvancedCellBorderStyle.None;
    
      // Ignore column and row headers and first row
      if (args.RowIndex < 1 || args.ColumnIndex < 0)
        return;
    
      if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex))
      {
        args.AdvancedBorderStyle.Top =
          DataGridViewAdvancedCellBorderStyle.None;
      }
      else
      {
        args.AdvancedBorderStyle.Top = AdvancedCellBorderStyle.Top;
      }
    }
    

    【讨论】:

    • 我认为我们只是在这里通过删除边框来制造一种错觉。
    • 但是不使用任何第三方库/控件不是您想要实现的吗?
    • 是的,我想做同样的事,但在此之后。我想放一个复选框来检查所有相同的组项目并执行一些操作。所以这不是解决方案,尽管您是对的,但我们可以拥有与在图像中显示相同的外观。感谢您的帮助..:)
    • 不用担心。我使用的原始问题未考虑您稍后在评论中指定的复选框要求。
    • 但是如何使它看起来像合并的单元格垂直居中@chridam?
    【解决方案3】:

    为了补充(选择的)答案,这里是完整的代码。未提及的想法是扩展 DataGridView 类的类。

    public class GroupByGrid : DataGridView
        {
    
            protected override void OnCellFormatting(
               DataGridViewCellFormattingEventArgs args)
            {
                // Call home to base
                base.OnCellFormatting(args);
    
                // First row always displays
                if (args.RowIndex == 0)
                    return;
    
    
                if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex))
                {
                    args.Value = string.Empty;
                    args.FormattingApplied = true;
                }
            }
    
            private bool IsRepeatedCellValue(int rowIndex, int colIndex)
            {
                DataGridViewCell currCell =
                   Rows[rowIndex].Cells[colIndex];
                DataGridViewCell prevCell =
                   Rows[rowIndex - 1].Cells[colIndex];
    
                if ((currCell.Value == prevCell.Value) ||
                   (currCell.Value != null && prevCell.Value != null &&
                   currCell.Value.ToString() == prevCell.Value.ToString()))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            protected override void OnCellPainting(
               DataGridViewCellPaintingEventArgs args)
            {
                base.OnCellPainting(args);
    
                args.AdvancedBorderStyle.Bottom =
                   DataGridViewAdvancedCellBorderStyle.None;
    
                // Ignore column and row headers and first row
                if (args.RowIndex < 1 || args.ColumnIndex < 0)
                    return;
    
                if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex))
                {
                    args.AdvancedBorderStyle.Top =
                       DataGridViewAdvancedCellBorderStyle.None;
                }
                else
                {
                    args.AdvancedBorderStyle.Top = AdvancedCellBorderStyle.Top;
                }
            }
        }
    

    source由 social.msdn.microsoft 提供

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多