我在网格中有一些数据,目前显示如下:
------------------
|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的情况下以另一种方式显示此数据,但结果是我展示的方式,这也将解决我的问题。
答案 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;
}
答案 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;
}
}
}
预览: