自定义单元合并

时间:2018-07-03 07:04:31

标签: c# gridview datatable merge devexpress

我需要在带有某些列合并行的gridview中显示数据。 来自数据库的原始数据,例如:

enter image description here

请帮助我显示网格视图,如:

enter image description here

  • tgl
  • 合并的 transaksi
  • 优先级价格创建人 transaksi

使用C#,如何准备该格式的gridview?请帮助我。

2 个答案:

答案 0 :(得分:1)

我刚刚选择了在this topic上发布的回复,并添加了一行来实现您想要的。

bool IsTheSameCellValue(int column, int row)
{
    // To compare only values on 1st and 2nd column (TGL, TRANSAKSI)
    if (column > 1) return false;

    DataGridViewCell cell1 = dataGridView[column, row];
    DataGridViewCell cell2 = dataGridView[column, row - 1];
    if (cell1.Value == null || cell2.Value == null)
    {
        return false;
    }
    return cell1.Value.ToString() == cell2.Value.ToString();
}

private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;
    if (e.RowIndex < 1 || e.ColumnIndex < 0)
        return;
    if (IsTheSameCellValue(e.ColumnIndex, e.RowIndex))
    {
        e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None;
    }
    else
    {
        e.AdvancedBorderStyle.Top = dataGridView.AdvancedCellBorderStyle.Top;
    }
}

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.RowIndex == 0)
        return;
    if (IsTheSameCellValue(e.ColumnIndex, e.RowIndex))
    {
        e.Value = "";
        e.FormattingApplied = true;
    }
}

但是,使用此解决方案不可能在合并的单元格中垂直居中放置文本,因为它只会擦除边框而不会完全重绘组件。

答案 1 :(得分:1)

我建议您仔细阅读文档-Tutorial: Cell Merging

  

要实现自定义单元格合并,请使用GridView.CellMerge事件   处理程序。首先,检查是否正在处理正确的列。然后,   获取要比较的两个单元格的显示文本。最后,   指示如果单元格的显示文本匹配,则将合并它们。组   将CellMergeEventArgs.Handled参数设置为true可以覆盖   网格对此列的默认处理。

示例:

using DevExpress.XtraGrid.Views.Grid;
// ... 
private void gridView1_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e) {
    GridView view = sender as GridView;
    if(view == null) return;
    if (e.Column == colCreatorID) {
        string text1 = view.GetRowCellDisplayText(e.RowHandle1, colCreatorID);
        string text2 = view.GetRowCellDisplayText(e.RowHandle2, colCreatorID);
        e.Merge = (text1 == text2);
        e.Handled = true;
    }
}

在处理列时使用您自己的条件。例如取transaksi 005,在这种情况下,检查第5行和第6行的值,然后比较是否为相等而创建的列取决于您的条件,将e.Merge设置为true