Замените "Красный Крест" в DataGridViewImageColumn "новой строки" пользовательским изображением

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

вот скриншот сетки с раздражающим изображением:

enter image description here

изображение, которое я хочу показать в Properties.Resources.Assign_OneToMany.

Я искал везде и пробовал несколько способов вроде (в конструкторе):

var assignChargeColumn = (DataGridViewImageColumn)this.GrdChargeArrivalPart.Columns["AssignCharge"];
assignChargeColumn.DefaultCellStyle.NullValue = null;
assignChargeColumn.DefaultCellStyle.NullValue = Properties.Resources.Assign_OneToMany;

или

private void GrdChargeArrivalPart_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    var grid = (DataGridView)sender;
    DataGridViewRow row = grid.Rows[e.RowIndex];
    if (row.IsNewRow)
    {
        var imageCell = (DataGridViewImageCell) row.Cells["AssignCharge"];
        imageCell.Value = new Bitmap(1, 1);  // or ...:
        imageCell.Value = Properties.Resources.Assign_OneToMany; // or ...:
        imageCell.Value = null;
    }
}

конечно, я также назначил это изображение в столбце-коллекции DataGridView в конструкторе:

enter image description here

Итак, каков правильный способ указать изображение по умолчанию для DataGridViewImageColumn который отображается, даже если нет данных, но только новая строка? Если это имеет значение, это jpg-изображение: enter image description here

2 ответов


вы можете действовать в CellFormatting событие:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // ToDo: insert your own column index magic number 
    if (this.dgv.Rows[e.RowIndex].IsNewRow && e.ColumnIndex == 2)
    {
        e.Value = Properties.Resources.Assign_OneToMany;
    }

}

enter image description here

Я считаю, что он игнорирует назначение свойства изображения в Редакторе столбцов, потому что это строка ничего / Null для начала.


нарисуйте изображение вручную, потому что система рисует изображение по умолчанию:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.ColumnIndex == 3 && e.RowIndex >= 0) //change 3 with your collumn index
        {
            e.Paint(e.CellBounds, DataGridViewPaintParts.All);

            if (dataGridView1 .Rows [e.RowIndex].IsNewRow )
            {
               Bitmap bmp = Properties.Resources.myImage;

               e.Graphics.DrawImage(bmp, e.CellBounds.Left + e.CellBounds.Width / 2 -  
                 bmp.Width / 2, e.CellBounds.Top + e.CellBounds.Height / 2 -  
                 bmp.Height / 2, bmp.Width, bmp.Height);
             }

             e.Handled = true;
        }
    }