2012-07-14 21 views
6

estoy buscando algo como esto en DataGridView:C# - DataGridView - Imagen y texto en la misma fila

Image | Text | 
Text | Text | 
Image | Text 

Básicamente, sólo quiero celdas de imagen y células de texto en la misma fila. Pude hacer que funcionara con diferentes tipos, por ejemplo: Casilla de verificación, Texto, etc. ... Pero no puedo hacer que funcione con las imágenes.

consigo este error: Invalid Cast from 'System.String' to 'System.Drawing.Image'

¿Alguien sabe la solución o tiene sugerencias sobre cómo debería hacerlo? Gracias

+1

publicar su margen de beneficio aspx aquí –

+0

ref1c - ¿está confundiendo filas y columnas en su pregunta? Tener imágenes y texto en la misma fila (en diferentes columnas) es trivial, solo tiene una imagen y una columna de texto. Tener una columna con imágenes y texto es un poco más complicado. Estoy trabajando en una respuesta para eso ahora. –

Respuesta

7

Es relativamente fácil tener una columna del tipo DataGridViewImageColumn en algunas celdas.

Todo lo que necesita hacer es reemplazar una celda deseada con un DataGridViewTextBoxCell.

Así, por ejemplo, si añado columna de la imagen de la siguiente para mi rejilla:

DataGridViewImageColumn imageColumn = new DataGridViewImageColumn(); 
imageColumn .Name = "ImageColumn"; 
imageColumn .HeaderText = "An Image!"; 
Image i = Image.FromFile(@"C:\Pictures\TestPicture.jpg"); 
imageColumn.Image = i; 
dataGridView1.Columns.Add(imageColumn); 

Puede reemplazar una célula dada con el texto como tal (en este caso en un controlador de botón, sino que también podría hacerlo en algún lugar como dentro de un controlador completo de enlace de datos).

private void button1_Click(object sender, EventArgs e) 
{ 
    dataGridView1.Rows[3].Cells["ImageColumn"] = new DataGridViewTextBoxCell(); 
    dataGridView1.Rows[3].Cells["ImageColumn"].Value = "Some text!"; 
} 

Esta solución deja un poco de trabajo para usted si usted quiere diversas imágenes (que necesita para unirse a una propiedad de tipo imagen) y si quieres un texto diferente. Como la propiedad Value de una columna de imagen es de tipo Image, no puede usar el mismo enlace.

Puede hacer su propia columna de imagen anulada que manejó esto, pero sería un poco de trabajo, que podría no pagar por sí mismo vs. simplemente establecer el valor de las celdas donde desea texto directamente.

+0

¡Gracias, hombre! Lo he intentado con una solución diferente pero no pude hacerlo. Olvidé usar 'DataGridViewTextBoxCell()' su solución me ayuda a lograr mi tarea –

1

Encontré que tenía que manejar el DataGridViewCellFormattingEventHandler y asignar la imagen en el DataGridViewCellFormattingEventHandler (que arrojaba la excepción cuando salía).

Dentro de la DataGridViewCellFormattingEventHandler Asigné e->Value = System::Drawing::Image::FromFile("c:/Test.jpeg");
o
e.Value = System.Drawing.Image.FromFile("c:/Test.jpeg");

0

Para una mejor solución, consulte este Blogspot puesto.

Probé la misma solución para mi proyecto, que está funcionando bien, la imagen de 16x16 píxeles para mostrar en mi celda cuadrícula de datos, he editado la función en la anterior clase TextandImageColumn:

protected override void Paint(Graphics graphics, Rectangle clipBounds, 
    Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
    object value, object formattedValue, string errorText, 
    DataGridViewCellStyle cellStyle, 
    DataGridViewAdvancedBorderStyle advancedBorderStyle, 
    DataGridViewPaintParts paintParts) 
    { 
     // Paint the base content 
     base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, 
      value, formattedValue, errorText, cellStyle, 
      advancedBorderStyle, paintParts); 

     if (this.Image != null) 
     { 
      PointF p = cellBounds.Location; 
      p.X += 0; 
      p.Y += 4; 

      graphics.DrawImage(this.Image, p); 
     } 
    } 
Cuestiones relacionadas