在datagridview中隐藏指定的单元格边框吗?

时间:2018-09-24 18:02:12

标签: c# winforms datagridview

我想从我的datagriview中隐藏一个或两个网格单元。但是有了这段代码,所有的网格都被隐藏了,这不是我想要的。

我想在Datagridview中隐藏一个或两个矩形单元格。

我不想隐藏包含我的单元格的列或数据。

我只想隐藏指定的单元格。

dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;

1 个答案:

答案 0 :(得分:0)

建议隐藏或修改单元格边框样式的方法是对CellPainting事件进行编码。

不用担心,不需要实际绘画。您需要做的就是在e.AdvancedBorderStyle参数中设置一些字段。

这里是一个例子:

enter image description here

请注意第3列中单元格的“垂直合并”外观;底部的“水平合并”单元格也是如此。也是第5列中单元格的双边框。

private void dataGridView1_CellPainting(object sender,
                                        DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == 2 && e.RowIndex == 6)
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;

    if (e.ColumnIndex == 2 && e.RowIndex == 1)
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;

    if (e.ColumnIndex == 4 && e.RowIndex == 4)
    {
        e.AdvancedBorderStyle.All = DataGridViewAdvancedCellBorderStyle.InsetDouble;
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.Single;
    }
}

请注意,隐藏边框相当简单:只需隐藏右侧或底部边框即可;其他边框样式需要反复试验(或加深理解;-)

在这里,我首先设置所有样式的样式,但是当它将botton涂成白色时(至少我认为是这样),然后将botton边框重新设置为单一。

您可能想简化检查的方式;这只是一个简单的例子。

更新

以下是使合并更加动态的代码:使用mergeCells函数将要合并或取消合并的单元格标记为其右邻居或下邻居:

private void mergeCells(DataGridViewCell cell, bool mergeH, bool mergeV)
{
    string m = "";
    if (mergeH) m += "R";  // merge horizontally by hiding the right border line
    if (mergeV) m += "B"; // merge vertically by hiding the bottom border line
    cell.Tag =  m == "" ? null : m;
}

CellPainting现在看起来像这样:

private void customDGV1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex < 0 || e.RowIndex < 0) return;
    DataGridViewCell cell = ((DataGridView)sender)[e.ColumnIndex, e.RowIndex];
    if (cell.Tag == null) return;
    string hide = cell.Tag.ToString();

    if (hide.Contains("R")) 
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;
    else
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single;

    if (hide.Contains("B")) 
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;
    else 
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.Single;

}

更新2:

如果要将其应用于ColumnHeaders,则需要先关闭dgv.EnableHeadersViualStyles