Рекомендуемый способ скрыть или изменить стиль границы ячейки - кодировать событие 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;
}
}
Обратите внимание, что скрывать границы довольно просто: просто скройте правую или нижнюю границу;другие стили границ требуют некоторого метода проб и ошибок (или более глубокого понимания; -)
Здесь я сначала устанавливаю стиль для всех сторон, но так как он окрашивает нижний слой в белый цвет (по крайней мере, это то, что я думаю), я затем устанавливаюграница боттона возвращается к одиночному.
Возможно, вы захотите упростить способ проверки;Это простой пример.
Обновление :
Вот код, который делает объединение более динамичным: используйте функцию 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
..