2009-06-02 5 views
5

He creado un DataGridView y he añadido un DataGridViewImageColumn (usando el Diseñador).DataGridViewImageColumn red x

DataGridView tiene "AllowUserToAddRows = true", por lo que se muestra una fila en blanco para que el usuario ingrese una nueva fila. En esta fila en blanco, DataGridViewImageColumn muestra una x roja. Quiero mostrar siempre la misma imagen en la columna independientemente de si la fila tiene datos o no (estoy vinculando el evento de clic de la celda para que use DataGridViewImageColumn como un botón).

¿Cómo me deshago de la x roja?

+0

Si una fila no tiene datos, ¿por qué se muestra/visible? – Cerebrus

+0

Cerebrus, se muestra una fila en blanco porque "AllowUserToAddRows = true". He editado mi pregunta para incluir esto. –

Respuesta

4

Uso una ImageList para guardar todas mis imágenes, pero aquí hay una versión recortada que debería ayudar. Tiene razón al establecer el valor, pero debe establecerlo en el equivalente nulo de un mapa de bits, que es solo una imagen estática en blanco. Yo uso:

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

donde nullImage se define anteriormente en la clase como:

private readonly Image nullImage = new Bitmap(1, 1); 
1

He encontrado una solución, pero no estoy seguro de que sea la mejor.

Anulo el evento RowsAdded y establezco el valor de DataGridViewImageColumn en nulo. Creo que como el valor es nulo, muestra la imagen.

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

Asimismo, establecer el NullValue de la columna a nulo en el Form_Load

colStartClock.DefaultCellStyle.NullValue = null; 

No estoy seguro de si hay algo más que tenga que hacer. Parece estar funcionando, pero parece un poco defectuoso: al hacer clic aleatoriamente a veces se producen excepciones, por lo que se necesita más investigación.

2

Miré a través de estas soluciones y la forma en que me dieron esta al trabajo era hacer esto después de InitializeComponent() llamada en el constructor para que la imagen por defecto de los datos ligados filas una imagen vacía

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

y enganche el RowPrePaintEvent para eliminar la X roja para la fila vacía al final de la rejilla porque AllowUserToAddRows = true:

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

Dónde numberOfRows es el número de filas válidos en la red. Solo pasé unas horas lidiando con esto. Espero que esto ahorra el dolor de cabeza de otra persona ...

2

Solía ​​propiedad IsNewRow de grid.row como esto

private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { 
     DataGridViewRow row = dgUserFileList.Rows[e.RowIndex]; 
     if (row.IsNewRow) { 
      row.Cells[0].Value = null; 
     } 
     } 
    } 
0

Otra forma de evitar este comportamiento por defecto para todos los elementos DataGridViewImageColumn en un DataGridView es interceptar el evento 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; 
}; 

de esta manera el componente utilizará siempre la imagen NullValue para la célula en lugar de la "imagen no disponible" por defecto.

1

El MSDN documentation es bastante detallado en esto:

De manera predeterminada, las celdas vacías mostrar un gráfico de error por defecto. Para evitar este gráfico aparezca para valores de celda igual a nula o DBNull.Value, establecer la propiedad DataGridViewCellStyle.NullValue del objeto de estilo célula devuelta por la propiedad DefaultCellStyle a nula antes de añadir filas con el control. Sin embargo, esto no afecta a la fila para nuevos registros. Para evitar que el gráfico de error aparezca en la fila para los nuevos registros cuando el control AllowUserToAddRows propiedad valor es cierto, también debe o bien establecer explícitamente el valor de la celda a nula en un controlador para el evento de control RowsAdded o conjunto la columna CellTemplate propiedad a una instancia de un tipo derivada de DataGridViewImageCell con una anulado DefaultNewRowValue propiedad que devuelve nula.

Traducido al codificar significa que usted puede hacer esto antes de añadir ninguna fila:

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

y luego poner esta clase alguna parte:

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

O ajuste Cell.Value a nulo en el Rows.Added evento.

+0

Funciona para mí. ¡Gracias! – camino