【发布时间】:2014-06-30 09:25:40
【问题描述】:
我想在 Windows 窗体上对 DataGridView 中具有相同名称的行进行分组,下面是我想要实现的图像。
是否可以在不使用任何第三方工具的情况下实现以下功能?
【问题讨论】:
-
不,使用标准控件无法轻松做到这一点。
-
@Killercam:是的,我也没有找到任何解决方案。
标签: c# winforms datagridview
我想在 Windows 窗体上对 DataGridView 中具有相同名称的行进行分组,下面是我想要实现的图像。
是否可以在不使用任何第三方工具的情况下实现以下功能?
【问题讨论】:
标签: c# winforms datagridview
在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
全部完成!
享受
【讨论】:
您可以尝试使用 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;
}
}
【讨论】:
为了补充(选择的)答案,这里是完整的代码。未提及的想法是扩展 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 提供
【讨论】: