9 de marzo de 2012

DataGridViewCheckBoxColumn VB

El datagridview por defecto muestra las columna como columntype= DataGridViewTextBoxColumn
para que sea combobox en vez de textbox cambialo por columntype=DataGridViewComboBoxColumn

Las columnas de los DataGridView en Visual Basic como valor enlazan una variable del tipo String, las columnas de tipo CheckBox también. Como todas las columnas, podemos comprobar su valor para una fila a través del método value del objeto celda de la columna correspondiente del objeto fila. En un ejemplo.

Me.DataGridView1.Rows(0).Cells("column1").Value                                    o bien

Me.DataGridView1.Rows(0).Cells(0).Value

Para agregar una columna tipo checkbox se puede hacer tanto en tiempo de ejecución como en tiempo de diseño.

Agregando columna Checkbox a DGV en tiempo de diseño

Para crear una columna CheckBox en el DataGridView nos dirigimos a sus propiedades y editamos la propiedad Columns. Usando el asistente añadimos una nueva columna del tipo DataGridViewCheckBoxColum, asi que damos click en Add Column





y luego escribimos el nombre, cambiamos el tipo por el de DatagridviewCheckBoxColumn y colocamos el Header text que se desee



Agregando columna Checkbox a DGV en tiempo de ejecución

para este ejemplo, mostrare los datos en un DGV y una columna de este sera del tipo checkbox, luego al presionar el botón eliminar se eliminaran de la base de datos los registros que estén en las filas en las cuales el checkbox este marcado.

Para llenar al DGV y añadir la columna hago uso de una función llamada cargardatos() y tengo este código para crear y agregar la columna checkbox en tiempo de ejecución al DataGridView, esto debe agregarse antes de llenar el DGV

Dim obj As New DataGridViewCheckBoxColumn   --> defino obj
        Dim col As Integer         --> lo usare para colocar la nueva columna           
        With obj
            obj.HeaderText = "Eliminar"   --> header que aparece en el DGV
            obj.Name = "Eliminar"   -->  Name para poder obtener el valor en codigo
            obj.Width = 50       --> el ancho de la columna
        End With

        With DataGridView1
            DataGridView1.Columns.Add(obj)   --> agregando la columna
            DataGridView1.Columns(DataGridView1.Columns.Count - 1).DisplayIndex = 0
            DataGridView1.ReadOnly = False   --> falso pues debe permitirnos dar click
            DataGridView1.DataSource = Nothing  --> aun no llenamos el DGV
        End With

 esta parte que viene es para asegurarnos que solo la columna del checkbox sea editable, aqui utilizo la variable col


For col = 1 To DataGridView1.Columns.Count - 1
            DataGridView1.Columns(col).ReadOnly = True
        Next


ahora el botón para eliminar transforma el valor de cada fila en el DGV a boolean y de ser true entonces toma el id de esa fila y lo manda a la función eliminar, tiene el siguiente código:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEliminar.Click
        For Each fila As DataGridViewRow In Me.DataGridView1.Rows
            If Convert.ToBoolean(fila.Cells("Eliminar").Value) Then
                eliminar(fila.Cells("id").Value.ToString())
            End If
        Next

agregamos un boton simplemente para quitar el check en aquellos checkbox que estén marcados, el código es así:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
            If DataGridView1.Rows(i).Cells(0).Value = True Then
                DataGridView1.Rows(i).Cells(0).Value = False
            Else
                DataGridView1.Rows(i).Cells(0).Value = True
            End If
        Next
    End Sub

a continuación la sencilla interfaz de la aplicación y el respectivo código, por cierto la cadena de conexión se llama cnn y los parámetros de configuración están en el app.config, ustedes realizan la conexión como mejor puedan



Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
    Dim cmd As SqlCommand
    Dim cadena As String = ConfigurationManager.ConnectionStrings("cnn").ConnectionString.ToString
    Dim cnn As SqlConnection

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        cargardatos()
    End Sub

   'Cargar el DGV y crear dinamicamente la columna checkbox
 Private Sub cargardatos()
        DataGridView1.Columns.Clear()
        Dim obj As New DataGridViewCheckBoxColumn
        Dim col As Integer
        With obj
            obj.HeaderText = "Eliminar"
            obj.Name = "Eliminar"
            obj.Width = 50
        End With

        With DataGridView1
            DataGridView1.Columns.Add(obj)
            DataGridView1.Columns(DataGridView1.Columns.Count - 1).DisplayIndex = 0
            DataGridView1.ReadOnly = False
            DataGridView1.DataSource = Nothing
        End With

        Try
            Using cnn = New SqlConnection(cadena)
                cnn.Open()
                Dim sql As New SqlDataAdapter("select * from img", cnn)
                Dim da As New DataSet
                sql.Fill(da)
                DataGridView1.DataSource = da.Tables(0)
            End Using
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try

        For col = 1 To DataGridView1.Columns.Count - 1
            DataGridView1.Columns(col).ReadOnly = True
        Next
    End Sub

    'aqui se quitan los check a todos aquellos checkbox que estes checkeados
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
            If DataGridView1.Rows(i).Cells(0).Value = True Then
                DataGridView1.Rows(i).Cells(0).Value = False
            Else
                DataGridView1.Rows(i).Cells(0).Value = True
            End If
        Next
    End Sub

    'aqui simplemente se quita el check sobre el checkbox clickeado en caso ya haya estado checkeado
    Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        If e.RowIndex < 0 Or Not e.ColumnIndex = 0 Then Exit Sub
        If Convert.ToBoolean(DataGridView1.Rows(e.RowIndex).Cells(0).Value) Then
            DataGridView1.Rows(e.RowIndex).Cells(0).Value = False
        Else
            DataGridView1.Rows(e.RowIndex).Cells(0).Value = True
        End If
    End Sub

    'Aqui verifica que filas tienen el check activado para luego enviar el id correspondiente a la funcion eliminar
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEliminar.Click
        For Each fila As DataGridViewRow In Me.DataGridView1.Rows
            If Convert.ToBoolean(fila.Cells("Eliminar").Value) Then
                eliminar(fila.Cells("id").Value.ToString())
            End If
        Next
    End Sub

    'Aqui se eliminan los registros con check activado segun el id
    Private Sub eliminar(ByVal id As String)
        Try
            Using cnn = New SqlConnection(cadena)
                cnn.Open()
                Dim p As New SqlCommand("eliminar", cnn)
                p.CommandType = CommandType.StoredProcedure
                p.Parameters.Add("@codigo", SqlDbType.Int).Value = id
                p.ExecuteNonQuery()
                MessageBox.Show("registro eliminado satisfactoriamente")
                cargardatos()
            End Using

        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub
End Class





viernes, marzo 09, 2012