На самом деле это довольно легко сделать, используя пользовательскую раскраску ячеек.
Все, что вам нужно сделать, это обработать событие DataGridView
CellPainting
:
dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);
И в обработчике сделать что-то вроде этого:
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex == -1)
{
e.Paint(e.CellBounds, DataGridViewPaintParts.All &~DataGridViewPaintParts.ContentBackground);
e.Handled = true;
}
}
Приведенный выше код очень прост — просто проверьте, находится ли текущая ячейка в строке заголовка (имеет индекс -1), а затем закрасьте все, кроме ContentBackground
.
Я проверил это только на своем компьютере с Windows 7, и все выглядит нормально, кажется, что фон содержимого используется только для глифа сортировки - вам нужно будет протестировать его в целевой среде, чтобы убедиться, что вам не нужно делать больше не требуется пользовательское рисование, чтобы сохранить ContentBackground без глифа.
Ширина ячейки заголовка по-прежнему будет включать пространство для глифа. В целом я бы согласился с тем, что, поскольку изменение этого становится немного беспорядочным, но если вам нужно, чтобы ширина соответствовала тексту, тогда будет работать что-то вроде следующего.
Сначала установите ширину в событии DataBindingComplete
элемента DataGridView
:
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (dataGridView1.AutoSizeColumnsMode == DataGridViewAutoSizeColumnsMode.AllCells)
{
// Loop over all the columns
foreach (DataGridViewColumn c in dataGridView1.Columns)
{
// Work out the size of the header text
Size s = TextRenderer.MeasureText(c.HeaderText, dataGridView1.Font);
// Change the autosize mode to allow us to see if the header cell has the
// longest text
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
if (s.Width + 10 > c.Width)
{
// If the header cell is longest we set the column width
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
c.Width = s.Width + 10;
}
else
{
// If the header cell is not longest, reset the autosize mode
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
}
}
}
После того, как вы это сделаете, вам нужно разрешить авторазмер столбца, когда текст ячейки длиннее заголовка.
Для этого я использовал событие CellValueChanged
:
void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataGridViewColumn c = dataGridView1.Columns[e.ColumnIndex];
if (c.AutoSizeMode == DataGridViewAutoSizeColumnMode.None)
{
Size s = TextRenderer.MeasureText(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(), dataGridView1.Font);
if (s.Width > c.Width)
{
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
}
}
}
person
David Hall
schedule
11.08.2012