Показать пустую ячейку в DataGridViewImageColumn с нулевыми значениями - PullRequest
1 голос
/ 03 мая 2019

Моя форма имеет элемент управления DataGridView, а Column 0 имеет тип DataGridViewImageColumn.
При первом отображении формы отображается пустой элемент управления DataGridView, а Column 0 имеет прямоугольник с красным крестиком в нем.
Тот же значок отображается, когда я добавляю строку в элемент управления.

Как избавиться от коробки с красным крестиком и ничего не отображать?

Я пробовал следующее.Globals.ERROR_LIST_SEVERITY имеет значение 0.

dataGridView_ErrorList.Columns[Globals.ERROR_LIST_SEVERITY].DefaultCellStyle.NullValue = null;

Также попробовал грубую силу, просто чтобы посмотреть, сработает ли это:

dataGridView_ErrorList.Rows[0].Cells[0].Value = null;

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

1 Ответ

0 голосов
/ 04 мая 2019

Как описано в MSDN Docs, в разделе «Примечания» класса DataGridViewImageColumn , чтобы заменить изображение ошибки по умолчанию на пользовательское изображение, требуется пользовательский класс, производный от DataGridViewImageCell .
Это позволяет переопределить свойство DefaultNewRowValue , обычно доступное только для чтения, при настройке пользовательского изображения. Также, в конце концов, нужно переопределить метод PaintErrorIcon .

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

Если изображение не указано, в ячейке будет отображаться пустой контент, также в DataGridView Новая строка .

Конструктор класса имеет несколько перегрузок. Вы можете указать:

  • Имя столбца (по умолчанию ImageColumn).
  • Текст заголовка столбца (по умолчанию ImageColumn).
  • DataPropertyName, если столбец будет привязан к полю источника данных (по умолчанию string.Empty).
  • Изображение, используемое в качестве заполнителя, когда изображение отсутствует (по умолчанию используется пустое растровое изображение)

Чтобы добавить пользовательский столбец Image в DataGridView, используйте метод DataGridView.Columns.Add(), передав новый DGVCustomImageColumn, инициализированный при необходимости.
Здесь я просто устанавливаю Column.Name, HeaderText и DataPropertyName:

dataGridView1.Columns.Add(new DGVCustomImageColumn("ImageCol", "Image", "ImageField"));

Класс DGVCustomImageColumn:

using System.Drawing;
using System.Windows.Forms;

class DGVCustomImageColumn : DataGridViewImageColumn
{
    private Bitmap dgvErrorBitmap = new Bitmap(1, 1);
    public DGVCustomImageColumn()
        : this("ImageColumn", "ImageColumn", string.Empty, null) { }
    public DGVCustomImageColumn(string colName, string headerText)
        : this(colName, headerText, string.Empty, null) { }
    public DGVCustomImageColumn(string colName, string headerText, string dataField)
        : this(colName, headerText, dataField, null) { }

    public DGVCustomImageColumn(string colName, string headerText, string dataField, Bitmap errorImage)
    {
        this.CellTemplate = new CustImageCell(errorImage ?? dgvErrorBitmap);
        this.DataPropertyName = dataField;
        this.HeaderText = headerText;
        this.Image = errorImage ?? dgvErrorBitmap;
        this.Name = colName;
    }

    protected class CustImageCell : DataGridViewImageCell
    {
        public CustImageCell() : this(null) { }
        public CustImageCell(Bitmap defaultImage) => this.DefaultNewRowValue = defaultImage;
        public override object DefaultNewRowValue { get; }
    }
}
...