2014-06-30 12 views
6

Tôi muốn nhóm các hàng có cùng tên trong DataGridView trên Windows Forms dưới đây là hình ảnh những gì tôi muốn triển khai.Hàng nhóm trong DataGridView

Có thể triển khai bên dưới mà không cần sử dụng bất kỳ công cụ của bên thứ ba nào không?

sample

+0

Không, không có cách nào để làm điều này một cách dễ dàng với sự kiểm soát tiêu chuẩn. – MoonKnight

+0

@Killercam: vâng, tôi cũng không tìm thấy giải pháp nào. – Deeps

Trả lời

3

Bạn có thể thử sử dụng các chức năng của tài sản MergeCells MSFlexGrid của tế bào dọc sáp nhập thay vì hàng nhóm như được giải thích trong bài viết này DataGridView Grouping in C#/VB.NET: Two Recipes. Trong ví dụ này, các hàng thuộc về một nhóm được nối trực quan bằng cách sử dụng các ô được hợp nhất theo chiều dọc - thay vì sử dụng các hàng nhóm ngang cổ điển.

enter image description here

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; 
    } 
} 
+1

Tôi nghĩ rằng chúng tôi chỉ tạo ra một ảo ảnh ở đây bằng cách xóa đường viền. – Deeps

+1

Nhưng đó không phải là những gì bạn muốn đạt được mà không cần sử dụng bất kỳ thư viện/kiểm soát của bên thứ ba nào? – chridam

+0

có, tôi muốn làm tương tự nhưng sau này. tôi muốn đặt một hộp kiểm để kiểm tra tất cả các mục nhóm giống nhau và thực hiện một số thao tác. vì vậy đây không phải là giải pháp tất cả mặc dù bạn là đúng, chúng tôi có thể có cùng một cái nhìn như hiển thị trong hình ảnh. Cảm ơn sự giúp đỡ .. :) – Deeps

3

ở nơi DataGridView đoạn mã sau vào

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 
các

Tất cả đã hoàn tất!

Thưởng thức

enter image description here

0

Bổ sung câu trả lời (lựa chọn), sau đây là toàn bộ mã. Ý tưởng không đề cập là một lớp mở rộng lớp 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 kê biếu không của social.msdn.microsoft

Các vấn đề liên quan