如何在Winforms中合并DataGridView单元格

时间:2013-05-27 14:05:58

标签: c# winforms datagridview

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

------------------
|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的情况下以另一种方式显示此数据,但结果是我展示的方式,这也将解决我的问题。

3 个答案:

答案 0 :(得分:33)

您必须先找到重复值

需要两种方法:

startInfo.FileName = @"c:\windows\system32\calc.exe";

在事件中,手绘:

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

并在form_load中:

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

Image of DGV_Merge

答案 1 :(得分: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

答案 2 :(得分:1)

在asp.net上有一些很好的回复,但是在winforms和本例中(在列中合并相同的数据),它没有被定义。

您可以使用color.transparent在datagridview中隐藏相同的值。 即使通过此代码,相同的行也不会被删除,并且可以很好地用于计算。 甚至你可以根据你的愿望来定义要合并的列。

以这种方式结束&#34; A&#34;是&#34; A4&#34;并且还开始了&#34; B&#34;是&#34; A4&#34;那些不会合并。通常更需要。 (如果你不想这样,最好使用其他回复)

MergeGridviewCells(DGV,new int [] {0,1}); //例如,如果要合并第一列data / then第3列然后第二列,则可以使用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;
            }
        }
     }

预览:

enter image description here