por - insertar imagen en celda datagridview c#
Imagen de DataGridView para columna de botón (1)
Estoy tratando de agregar una imagen / botón seleccionable a una columna de botón de vista de cuadrícula de datos.
La imagen / botón será un ícono para jugar o detenerse. Si el usuario hace clic en el botón Reproducir, se inicia un servicio en el sistema, si el usuario hace clic en el botón Detener, se detiene un servicio.
Ya he escrito funciones para iniciar y detener el servicio. Lo que me cuesta trabajo es mostrar el botón / imagen en la cuadrícula de datos y hacer que se pueda hacer clic.
Esto es lo que tengo para el código:
this.dgrdServices.RowPrePaint +=new DataGridViewRowPrePaintEventHandler(dgv_RowPrePaint);
this.dgrdServices.Rows.Add();
this.dgrdServices.Rows[0].Cells[0].Value = Image.FromFile(@"C:/users/brad/desktop/green-dot.gif");
this.dgrdServices.Rows[0].Cells[1].Value = "MyServer";
this.dgrdServices.Rows[0].Cells[2].Value = "MyService";
this.dgrdServices.Rows[0].Cells[3].Value = "Started";
this.dgrdServices.Rows[0].Cells[4].Value = new DataGridViewButtonCell();
this.dgrdServices.Rows[0].Cells[5].Value = "Uninstall";
No puedo determinar si sería mejor utilizar un botón que sea una imagen o solo una imagen en la que se pueda hacer clic. Tampoco puedo hacer que un botón aparezca correctamente.
Gracias Brad
Mostrar imagen en el botón
Puede agregar un DataGridViewButtonColumn
, luego manejar el evento CellPainting
de la grilla y verificar si el evento se plantea para la columna de su botón, luego dibujar una imagen en él. Al final del evento, no te olvides de configurar e.Handled = true;
.
En el siguiente código, supongo que tienes un recurso de imagen como SomeImage
:
private void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0)
return;
//I supposed your button column is at index 0
if (e.ColumnIndex == 0)
{
e.Paint(e.CellBounds, DataGridViewPaintParts.All);
var w = Properties.Resources.SomeImage.Width;
var h = Properties.Resources.SomeImage.Height;
var x = e.CellBounds.Left + (e.CellBounds.Width - w) / 2;
var y = e.CellBounds.Top + (e.CellBounds.Height - h) / 2;
e.Graphics.DrawImage(Properties.Resources.SomeImage, new Rectangle(x, y, w, h));
e.Handled = true;
}
}
Mostrar imagen sin botón
Para mostrar una sola imagen en todas las filas, incluida una fila nueva, puede establecer la propiedad de la Image
de DataGridViewImageColumn
. De esta forma, la imagen se mostrará en esa columna en todas las filas:
dataGridView1.Columns.Add(new DataGridViewImageColumn(){
Image = Properties.Resources.SomeImage, Name = "someName", HeaderText = "Some Text"
});
Además, si desea tener diferentes imágenes para las celdas, puede establecer el valor formateado de DataGridViewImageColumn
en el evento CellFormatting
:
void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.RowIndex < 0)
return;
//I supposed the image column is at index 1
if (e.ColumnIndex == 1)
e.Value = Properties.Resources.SomeImage;
}
También puede establecer la propiedad de la Image
de DataGridViewImageColumn
en una imagen, pero la imagen no se mostrará en la nueva fila.
Manejar clic
Para manejar Haga clic en la imagen / botón, puede manejar el evento CellClick
o CellContentClick
:
void grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0)
return;
//I suposed you want to handle the event for column at index 1
if (e.ColumnIndex == 1)
MessageBox.Show("Clicked!");
}
Si manipulaste CellContentClick
, deberías hacer clic exactamente en la imagen cuando CellContentClick
columna de imagen.
Captura de pantalla
Aquí está el resultado. La primera columna es una columna de botón que muestra una imagen y la segunda columna es una columna de imagen normal configurada para mostrar una sola imagen: