在DataGridView中对行进行分组

问题描述 投票:7回答:3

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

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

c# winforms datagridview
3个回答
4
投票

您可以尝试使用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;
  }
}

5
投票

在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

全部做完!

请享用


1
投票

为了补充(选择的)答案,这里是完整的代码。未提及的想法是扩展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提供

© www.soinside.com 2019 - 2024. All rights reserved.