Group rows in DataGridView

后端 未结 3 1608
独厮守ぢ
独厮守ぢ 2020-12-06 12:56

I want to group rows which is having same Name in DataGridView on Windows Forms below is the image what I want to implement.

Is it possible to implemen

3条回答
  •  清歌不尽
    2020-12-06 13:24

    To supplement the (chosen) answer, here's the full code. The unmentioned idea is a class extending the DataGridView class.

    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 courtesy of social.msdn.microsoft

提交回复
热议问题