23

我在网格中有一些数据,当前显示如下:

------------------
|Hd1| Value  |
------------------
|A  | A1     |
------------------
|A  | A2     |
------------------
|A  | A3     |
------------------
|A  | A4     |
------------------
|B  | B1     |
------------------
|B  | B2     |
------------------
|B  | B3     |
------------------
|B  | B4     |
------------------
|B  | B5     |
------------------
|C  | C1     |
------------------
|C  | C2     |
------------------

我想让它看起来像这样:

|Hd | Value  |
------------------
|A  | A1     |
    ----------
|   | A2     |
    ----------
|   | A3     |
    ----------
|   | A4     |
------------------
|B  | B1     |
    ----------
|   | B2     |
    ----------
|   | B3     |
    ----------
|   | B4     |
    ----------
|   | B5     |
------------------
|C  | C1     |
    ----------
|   | C2     |
------------------

有什么办法可以合并这些单元格吗?我在很多方面也尝试过谷歌,但没有找到任何合适的方法。如果可以在不使用 datagridview 的情况下以另一种方式显示这些数据,但结果是我展示的方式,那也将解决我的问题。

4

4 回答 4

42

您必须首先找到重复的值

需要两种方法:

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

在事件中,细胞绘画:

private void dataGridView1_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 = dataGridView1.AdvancedCellBorderStyle.Top;
    }  
}

现在在单元格格式中:

if (e.RowIndex == 0)
    return;
if (IsTheSameCellValue(e.ColumnIndex, e.RowIndex))
{
    e.Value = "";
    e.FormattingApplied = true;
}

在 form_load 中:

dataGridView1.AutoGenerateColumns = false;

DGV_Merge 的图像

于 2015-05-08T07:28:54.257 回答
5

DataGridView 控件没有用于合并单元格的相关属性或方法,但您可以使用自定义绘制来完成相同的操作。您可以使用DataGridView.CellPainting事件或重写 Paint 方法。

此外,您还需要重写 DataGridView.CellClick、CellEnter、CellFormatting 和其他方法,以便为您的 DataGridView 提供完整的功能。例如,在单击单元格时,必须自定义绘制整个合并单元格(或构成合并单元格的一组单元格)。

你可以在这里找到一些示例代码:

http://social.msdn.microsoft.com/forums/en-US/vbinterop/thread/5b659cbd-7d29-4da4-8b38-5d427c3762e2

http://forums.codeguru.com/showthread.php?415930-DataGridView-Merging-Cells

http://www.codeproject.com/Questions/152113/How-can-i-merge-DataGridView-Rows-Cells-with-Equal

于 2013-05-27T14:24:59.860 回答
1

在 asp.net 上有一些很好的响应,但在 winforms 和这个例子中(合并列中的相同数据)它没有定义。

您可以使用 color.transparent 在 datagridview 中隐藏相同的值。即使通过此代码,也不会删除相同的行,并且可以很好地进行数学计算。甚至您也可以按您的愿望排序定义要合并的列。

这样,如果“A”的结尾是“A4”并且“B”的开头也是“A4”,那么这些将不会被合并。这通常是更需要的。(如果您不想要这个,最好使用其他响应)

MergeGridviewCells(DGV,new int[] {0,1});//例如如果你想合并第一列数据/然后是第三列然后是第二列你可以使用new int[] {0,2,1}

private void MergeGridviewCells(DataGridView DGV, int[] idx)
    {
        DataGridViewRow Prev = null;

        foreach (DataGridViewRow item in DGV.Rows)
        {
            if (Prev != null)
            {
                string firstCellText = string.Empty;
                string secondCellText = string.Empty;

                foreach (int i in idx)
                {                        
                    DataGridViewCell firstCell = Prev.Cells[i];
                    DataGridViewCell secondCell = item.Cells[i];

                    firstCellText = (firstCell != null && firstCell.Value != null ? firstCell.Value.ToString() : string.Empty);
                    secondCellText = (secondCell != null && secondCell.Value != null ? secondCell.Value.ToString() : string.Empty);

                    if (firstCellText == secondCellText)
                    {                           
                        secondCell.Style.ForeColor = Color.Transparent;
                    }
                    else
                    {
                        Prev = item;
                        break;
                    }
                }
            }
            else
            {
                Prev = item;
            }
        }
     }

预习:

在此处输入图像描述

于 2017-10-15T07:15:09.227 回答
0

我花了很长时间寻找这个,因为我的老板不想购买任何现成的组件。这应该提交到 .NET 代码中:datagridvewtextboxcell-with-span-behaviour 它可以正常工作并且使用起来非常简单。适用于 VB/C# .NET 4.5 到 6。跨行和列,包括标题。

DataGridView.Columns.Add(new DataGridViewTextBoxColumnEx());
DataGridViewTextBoxCellEx dataGridViewCell = (DataGridViewTextBoxCellEx)DataGridView[colIdx, rowIdx];
dataGridViewCell.ColSpan = 2;
dataGridViewCell.RowSpan = 6;
于 2022-02-01T06:39:28.660 回答