Это похоже на ошибку. На самом деле это не так, но похоже на единицу, когда вы устанавливаете свойство, и у вас разные результаты в аналогичных условиях.
Что происходит:
[DataGridView].Rows[N].HeaderCell
имеет тип DataGridViewRowHeaderCell . Свойство FormattedValue
не принадлежит этому классу напрямую, оно получено из DataGridViewHeaderCell , которое, в свою очередь, выводит его из DataGridViewCell (класс generi c).
DataGridViewHeaderCell
устанавливает типы FormattedValue
и Value
по умолчанию как:
private static Type defaultFormattedValueType = typeof(System.String);
private static Type defaultValueType = typeof(System.Object);
Когда мы устанавливаем:
[DataGridView].Rows[N].HeaderCell.Value = 10;
Значение сохраняется как объект , упаковывая int
.
Если мы проверяем объект HeaderCell
сразу после установки значения, мы можем видеть, что свойства FormattedValue
и FormattedValueType
установлены соответственно на "10"
и System.String
.
Это происходит потому, что значения этих свойств извлекаются классом DataGridViewCell
, , вызывающим его метод GetFormattedValue () .
Свойство FormattedValueType
по умолчанию имеет значение System.String
.
Итак, похоже на , это FormattedValue
будет использоваться при визуализации содержимого заголовка.
Этого не происходит. Когда требуется отредактировать заголовок, DataGridViewRowHeaderCell
устанавливает его FormattedValue
в исходное значение (int
): FormattedValueType
игнорируется. Причина объяснена в комментариях в методе GetContentBounds () (и в нескольких других местах):
Намеренно не используют GetFormattedValue, потому что ячейки заголовка не обычно не выполняет форматирование.
Границы содержимого вычисляются по требованию [...]
По той же причине ячейка заголовка строки не вызывает события CellFormatting
,
Приватный метод PaintPrivate () , который отображает ячейку заголовка строки, получает formattedValue
, представляющий int
, а не строку.
Затем используется:
string formattedString = formattedValue as string;
в , преобразующий formattedValue
в строку. Поскольку formattedValue
не является строкой, cast возвращает null
, поэтому контент не отображается.
Это же условие, конечно, применимо к DataGridViewCellPaintingEventArgs : когда возникает событие CellPainting
, свойство e.FormattedValue
возвращает 10
(int
).
Вместо этого возвращается "10"
, если мы установим:
[DataGridView].Rows[N].HeaderCell.Value = "10"; // Or 10.ToString()
В этом случае string formattedString = formattedValue as string;
возвращает строку, и это содержимое отображается. Теперь, когда он рендерится, мы можем лучше понять, почему мы не можем использовать значение ячейки RowHeader для отображения контента в этом типе ячеек: границы контента не совсем считаются , а рендеринг жалким.
Для нумерации строк с помощью заголовка строки нам нужно обработать событие CellPainting .