DataGridView HeaderCell не показывает значение, когда он имеет тип цифры c - PullRequest
3 голосов
/ 05 апреля 2020

Может кто-нибудь объяснить мне, почему этот код

dataGridView1.Rows[0].HeaderCell.Value = 10;

ничего не показывает, в то время как этот

dataGridView1.Rows[0].HeaderCell.Value = 10.ToString();

работает правильно?

1 Ответ

4 голосов
/ 05 апреля 2020

Это похоже на ошибку. На самом деле это не так, но похоже на единицу, когда вы устанавливаете свойство, и у вас разные результаты в аналогичных условиях.

Что происходит:
[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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...