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

Kru*_*non 2 c# datagridview winforms

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

我想从我的 Datagridview 中隐藏一两个矩形单元格。

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

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

dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
Run Code Online (Sandbox Code Playgroud)

TaW*_*TaW 5

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

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

下面是一个例子:

在此处输入图片说明

请注意第 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在这里,我首先为所有边设置样式,但是当它把底部涂成白色时(至少我认为它是这样),然后我将底部边框设置回单色。

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

更新:

这是一个使合并更加动态的代码:使用该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;
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

更新 2:

如果您想将此应用于ColumnHeaders您需要先关闭dgv.EnableHeadersViualStyles..