DataGridViewImageColumn red x - PullRequest
       15

DataGridViewImageColumn red x

5 голосов
/ 02 июня 2009

Я создал DataGridView и добавил DataGridViewImageColumn (с помощью конструктора).

DataGridView имеет «AllowUserToAddRows = true», поэтому пустая строка отображается для ввода пользователем новой строки. В этой пустой строке DataGridViewImageColumn отображает красный x. Я хочу всегда отображать одно и то же изображение в столбце независимо от того, есть ли в строке какие-либо данные или нет (я связываю событие click ячейки, поэтому использую DataGridViewImageColumn в качестве кнопки).

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

Ответы [ 6 ]

4 голосов
/ 09 июня 2009

Я использую ImageList для хранения всех своих изображений, но вот урезанная версия, которая должна помочь. Вы правы, чтобы установить значение, но вы должны установить его в нулевой эквивалент растрового изображения, которое является просто статическим пустым изображением. Я использую:

e.Value = (imageIndex != int.MinValue) ? imageList.Images[imageIndex] : nullImage;

где nullImage ранее определено в классе как:

private readonly Image nullImage = new Bitmap(1, 1);
2 голосов
/ 19 сентября 2011

Я использовал IsNewRow свойство grid.row вот так

private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) {
      DataGridViewRow row = dgUserFileList.Rows[e.RowIndex];
      if (row.IsNewRow) {
          row.Cells[0].Value = null;
        }
      }
    }
2 голосов
/ 24 ноября 2010

Я посмотрел через эти решения, и способ заставить это работать - сделать это после вызова InitializeComponent() в конструкторе, чтобы сделать изображение по умолчанию для строк с привязкой к данным пустым

dataGridView1.Columns[0].DefaultCellStyle.NullValue = null;

И подключите RowPrePaintEvent, чтобы удалить красный X для пустой строки в конце сетки, потому что AllowUserToAddRows = true:

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
      if (e.RowIndex >= numberOfRows)
      {
           dataGridView1.Rows[e.RowIndex].Cells[0].Value = null;
      }
}

Где numberOfRows - количество допустимых строк в сетке. Просто провел несколько часов, занимаясь этим. Надеюсь, это спасет кого-то еще от головной боли ...

1 голос
/ 24 сентября 2015

Документация MSDN довольно многословна по этому вопросу:

По умолчанию пустые ячейки отображают графику ошибок по умолчанию. Предотвращать этот график появляется для значений ячеек, равных null или DBNull.Value , установите DataGridViewCellStyle.NullValue свойства объект стиля ячейки, возвращаемый свойством DefaultCellStyle в null перед добавлением строк в элемент управления. Это не влияет на строку для новые записи, однако. Чтобы изображение ошибки не отображалось в строка для новых записей, когда свойство AllowUserToAddRows элемента управления значение равно true , вы также должны явно установить значение ячейки в null в обработчике для элемента управления RowsAdded или установите столбец CellTemplate свойство для экземпляра DataGridViewImageCell -приобретенный тип с переопределением DefaultNewRowValue свойство, которое возвращает null .

В переводе на код это означает, что вы можете сделать это перед добавлением каких-либо строк:

var column = new DataGridViewImageColumn();
column.DefaultCellStyle.NullValue = null;
column.CellTemplate = new DataGridViewEmptyImageCell();

А затем поместите этот класс куда-нибудь:

private class DataGridViewEmptyImageCell : DataGridViewImageCell
{
    public override object DefaultNewRowValue { get { return null; } }
}

Или установите Cell.Value в null в событии Rows.Added.

1 голос
/ 03 июня 2009

Я нашел решение, но не уверен, что это лучший способ.

Я переопределяю событие RowsAdded и устанавливаю значение DataGridViewImageColumn равным нулю. Я думаю, так как значение равно нулю, оно отображает изображение.

private void dgvWorksheet_RowsAdded(object sender, 
     DataGridViewRowsAddedEventArgs e)
{
    dgvWorksheet.Rows[e.RowIndex].Cells[colStartClock.Index].Value = null;
}

Я также установил для NullValue столбца значение null в Form_Load

colStartClock.DefaultCellStyle.NullValue = null;

Я не уверен, что мне нужно что-то еще делать. Кажется, что это работает, но кажется, что оно немного ошибочное - случайное нажатие иногда приводит к исключениям, поэтому требуется дополнительное расследование.

0 голосов
/ 20 июля 2015

Еще один способ избежать этого поведения по умолчанию для всех элементов DataGridViewImageColumn в DataGridView - перехватить событие CellFormatting:

dataGridView1.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.RowIndex < 0 || e.ColumnIndex < 0)
        return;

    var grid = (DataGridView)sender;
    if (grid.Columns[e.ColumnIndex] is DataGridViewImageColumn &&
        grid[e.ColumnIndex, e.RowIndex].DefaultNewRowValue.Equals(e.Value))
        e.Value = null;
};

Таким образом, компонент всегда будет использовать изображение NullValue для ячейки вместо стандартного «недоступного изображения».

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