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?
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?
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.
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;
}
}
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
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
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
ở 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
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
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
@Killercam: vâng, tôi cũng không tìm thấy giải pháp nào. – Deeps