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
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 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
For
col = 1 To DataGridView1.Columns.Count - 1
DataGridView1.Columns(col).ReadOnly
= True
Next
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