none
Colocar una columna tipo boton en DATAGRIDVIEW que cambie segun valores de las columnas de su misma fila RRS feed

  • Pregunta

  • Buenas y saludos a toda la Comunidad:


    Tengo una consulta y no se muy bien como hacerlo, el caso es que tengo un DataGridView que muestro conectado a un DataTable que almacena Documentos que tiene como campos entre otros su Nombre, Tipo de documento, Fecha de Caducidad y su Fecha de Aviso de Caducidad (normalmente unos 60 dias antes) entre otros.

    Ahora bien lo que quiero es agregarle una columna a este DataGridView (DGVDocumentos) que contenga un boton en cada Fila del DGV con un icono asociado, que cambie y muestre uno diferente dependiendo de los valores que se encuentre en cada Fila correspondiente a cada Documento.

    Es decir sería como una especie de semáforo en el que el icono del botón de cada fila cambiaría según los siguientes criterios:

    - Si la Fecha de Hoy NO es posterior a la Fecha de Aviso del documento y por tampoco por tanto a la Fecha de Caducidad (Icono Verde)

    - Si la Fecha de Hoy SI es posterior a la Fecha de Aviso del documento pero NO a la Fecha de Caducidad  (Icono Amarillo)

    - Si la Fecha de Hoy SI es posterior a la Fecha de Aviso del documento y tambien SI es posterior a la Fecha de Caducidad  (Icono Rojo)

    En fin, no estoy muy ducho en esto de hacer florituras con el DataGridView que no sea mas que mostrar textos, por lo que me gustaría que me ayudasen con alguna sugerencia.

    Muchísimas Gracias, por adelantado

    José M.


    Rynthbarim. "Si caminas solo puedes ir más rápido, si vas acompañado irás mas lejos"

    viernes, 2 de noviembre de 2018 11:50

Respuestas

  • Hola  Rynthbarim

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te recomiendo entrar al siguiente enlace donde encontrarás una pequeña guía acerca de las columnas de control del DataGridView.

    https://docs.microsoft.com/es-es/dotnet/framework/winforms/controls/column-fill-mode-in-the-windows-forms-datagridview-control

    Gracias por usar los foros de MSDN.

    Pablo Rubio

     _____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Marcado como respuesta Rynthbarim sábado, 3 de noviembre de 2018 9:17
    viernes, 2 de noviembre de 2018 18:50
  • Hola:
    En el ejemplo que te expongo, en vez de 1 columna con 1 boton, usa 1 columna con 1 imagen.
    En un Form con 1 DataGridView, copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form1
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                ' crear la sentencia sql para obtener las filas
                Dim lsQuery As String = "SELECT EmployeeID, TitleOfCourtesy, FirstName, LastName, BirthDate, Salario, Gender FROM Employees WHERE Title IS NOT NULL"
                Dim lsCadConexion As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
                Using loConexion As New SqlConnection(lsCadConexion)
                    Dim daAdaptador As New SqlDataAdapter(lsQuery, loConexion)
                    daAdaptador.Fill(moDataTable)
                End Using
                Me.dataGridView1.DataSource = moDataTable
                ' ocultar la columna que indica el género del cliente
                Me.dataGridView1.Columns("Gender").Visible = False
                ' crear una nueva columna de tipo imagen para mostrar un icono indicativo del género del cliente y agregarla a la colección de columnas del control
                Dim colGenero As New DataGridViewImageColumn()
                colGenero.Name = "colGenero"
                Me.dataGridView1.Columns.Add(colGenero)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub dataGridView1_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dataGridView1.CellFormatting
            ' cuando se vaya a pintar la celda de la columna de imagen
            If Me.dataGridView1.Columns(e.ColumnIndex).Name = "colGenero" Then
                ' establecer la altura de la fila para que se pueda visualizar correctamente
                Me.dataGridView1.Rows(e.RowIndex).Height = 40
                ' asignar la imagen adecuada
                Select Case DirectCast(Me.dataGridView1.Rows(e.RowIndex).Cells("Gender").Value, String)
                    Case "M"
                        e.Value = New Bitmap(Application.StartupPath & "\SimboloMasculino.jpg", False)
                        Exit Select
                    Case "F"
                        e.Value = New Bitmap(Application.StartupPath & "\SimboloFemenino.jpg", True)
                        Exit Select
                End Select
            End If
        End Sub
    End Class

    El resultado es el siguiente


    P.D.
    Se usan 2 ficheros graficos que son SimboloMasculino.jpg y SimboloFemenino.jpg

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta Rynthbarim sábado, 3 de noviembre de 2018 9:17
    sábado, 3 de noviembre de 2018 8:49

Todas las respuestas

  • Hola  Rynthbarim

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te recomiendo entrar al siguiente enlace donde encontrarás una pequeña guía acerca de las columnas de control del DataGridView.

    https://docs.microsoft.com/es-es/dotnet/framework/winforms/controls/column-fill-mode-in-the-windows-forms-datagridview-control

    Gracias por usar los foros de MSDN.

    Pablo Rubio

     _____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Marcado como respuesta Rynthbarim sábado, 3 de noviembre de 2018 9:17
    viernes, 2 de noviembre de 2018 18:50
  • Hola:
    En el ejemplo que te expongo, en vez de 1 columna con 1 boton, usa 1 columna con 1 imagen.
    En un Form con 1 DataGridView, copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form1
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                ' crear la sentencia sql para obtener las filas
                Dim lsQuery As String = "SELECT EmployeeID, TitleOfCourtesy, FirstName, LastName, BirthDate, Salario, Gender FROM Employees WHERE Title IS NOT NULL"
                Dim lsCadConexion As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
                Using loConexion As New SqlConnection(lsCadConexion)
                    Dim daAdaptador As New SqlDataAdapter(lsQuery, loConexion)
                    daAdaptador.Fill(moDataTable)
                End Using
                Me.dataGridView1.DataSource = moDataTable
                ' ocultar la columna que indica el género del cliente
                Me.dataGridView1.Columns("Gender").Visible = False
                ' crear una nueva columna de tipo imagen para mostrar un icono indicativo del género del cliente y agregarla a la colección de columnas del control
                Dim colGenero As New DataGridViewImageColumn()
                colGenero.Name = "colGenero"
                Me.dataGridView1.Columns.Add(colGenero)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub dataGridView1_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dataGridView1.CellFormatting
            ' cuando se vaya a pintar la celda de la columna de imagen
            If Me.dataGridView1.Columns(e.ColumnIndex).Name = "colGenero" Then
                ' establecer la altura de la fila para que se pueda visualizar correctamente
                Me.dataGridView1.Rows(e.RowIndex).Height = 40
                ' asignar la imagen adecuada
                Select Case DirectCast(Me.dataGridView1.Rows(e.RowIndex).Cells("Gender").Value, String)
                    Case "M"
                        e.Value = New Bitmap(Application.StartupPath & "\SimboloMasculino.jpg", False)
                        Exit Select
                    Case "F"
                        e.Value = New Bitmap(Application.StartupPath & "\SimboloFemenino.jpg", True)
                        Exit Select
                End Select
            End If
        End Sub
    End Class

    El resultado es el siguiente


    P.D.
    Se usan 2 ficheros graficos que son SimboloMasculino.jpg y SimboloFemenino.jpg

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta Rynthbarim sábado, 3 de noviembre de 2018 9:17
    sábado, 3 de noviembre de 2018 8:49
  • Ok, Gracias Carlos me sirve igualmente, lo de poner un botón,en lugar de una imagen es porque quería ponerle despues un comportamiento, como un clic que sacase un informe del documento. Pero bien empezaré con la imagen, que también sirve para asignarle un comportamiento al hacer clic.

    Rynthbarim. "Si caminas solo puedes ir más rápido, si vas acompañado irás mas lejos"

    sábado, 3 de noviembre de 2018 9:21