Sumar datos 1. Option Explicit On 2. Option Strict On 3. 4. Public Class Form1 5. 6. Private Sub Form1_Load( _ 7. ByVal sender As System.
Object, _ 8. ByVal e As [Link]) Handles [Link] 9. [Link] = "Sumar columnas en DataGridview" 10. [Link] = "Sumar" 11. [Link] = "Cargar valores" 12. End Sub 13. 14. ' funcin que retorna el total 15. Private Function Sumar( _ 16. ByVal nombre_Columna As String, _ 17. ByVal Dgv As DataGridView) As Double 18. 19. Dim total As Double = 0 20. 21. ' recorrer las filas y obtener los items de la columna i ndicada en "nombre_Columna" 22. Try 23. For i As Integer = 0 To [Link] - 1 24. total = total + CDbl([Link](nombre_Columna.ToL ower, i).Value) 25. Next 26. 27. Catch ex As Exception 28. MsgBox([Link]) 29. End Try 30. 31. ' retornar el valor 32. Return total 33. 34. End Function 35. 36. Private Sub Button1_Click( _ 37. ByVal sender As [Link], _ 38. ByVal e As [Link]) Handles [Link] 39. 40. ' muostrar el total de la suma en el control Label para la columna llamada Costo 41. [Link] = "Total :" & Format(Sumar("costo", DataGrid View1), "c").ToString 42. End Sub 43. 44. Private Sub Button2_Click( _ 45. ByVal sender As [Link], _ 46. ByVal e As [Link]) Handles [Link] 47. 48. Randomize() 49. 50. With DataGridView1 51. ' Agregar dos columnas 52. .[Link]() 53. .[Link]("Id", "Id Producto") 54. .[Link]("Costo", "Costo") 55. ' agregar 10 filas 56. .RowCount = 10 57. 58. ' aadir un valor para el campo ID 59. For Filas As Integer = 0 To .RowCount - 1 60. .Item(0, Filas).Value = Filas
61. 62. 63. 64. 65. ), "c") 66. 67. 68.
Next ' aadir un valor aleatorio para el campo Costo For Filas As Integer = 0 To .RowCount - 1 .Item(1, Filas).Value = Format(CInt(Rnd() * 2500 Next End With End Sub
Cdigo fuente
Texto planoCopiar cdigo fuenteImprimir 1. Option Explicit On 2. Option Strict On 3. 4. ' Espacios de nombres 5. ' ''''''''''''''''''''''''''''''''''''''''' 6. Imports [Link] 7. 8. Public Class Form1 9. 10. 'BindingSource 11. Private WithEvents bs As New BindingSource 12. 13. ' Adaptador de datos sql 14. Private SqlDataAdapter As SqlDataAdapter 15. 16. ' Cadena de conexin 17. Private Const cs As String = "Data Source=(local)\SQLEXPRESS ;" & _ 18. "Initial Catalog=demo_bd;" & _ 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. "Integrated Security=true" ' flag Private bEdit As Boolean ' actualizar los cambios al salir ' '''''''''''''''''''''''''''''''''''''''' Private Sub Form1_FormClosing( _ ByVal sender As Object, _
29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
ByVal e As [Link]) _ Handles [Link] If bEdit Then 'preguntar si se desea guardar If (MsgBox( _ "Guardar cambios ?", _ [Link], _ "guardar")) = [Link] Then Actualizar(False) End If End If End Sub Private Sub Form1_Load( _ ByVal sender As [Link], _ ByVal e As [Link]) Handles [Link]
' propiedades del datagrid ' ''''''''''''''''''''''''''''''''''''' With DataGridView1 ' alternar color de filas .[Link] = Color.F loralWhite 53. .[Link] = [Link] 54. ' Establecer el origen de datos para el DataGridview 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. .DataSource = bs End With ' botones ' ''''''''''''''''''''''''''''''''''''' btn_Update.Text = "Guardar cambios" btn_delete.Text = "Eliminar registro" btn_new.Text = "Nuevo" btn_first.Text = "<<" btn_Previous.Text = "<" btn_next.Text = ">" btn_last.Text = ">>" ' cagar los datos cargar_registros("Select * From alumnos Order by Apellid o", DataGridView1) End Sub Private Sub cargar_registros( _ ByVal sql As String, _ ByVal dv As DataGridView) Try
' Inicializar el SqlDataAdapter indicandole el coman do y el connection string 80. SqlDataAdapter = New SqlDataAdapter(sql, cs) 81. 82. Dim SqlCommandBuilder As New SqlCommandBuilder(SqlDa taAdapter) 83. 84. ' llenar el DataTable 85. Dim dt As New DataTable() 86. [Link](dt) 87.
88. 89. '''''''''' 90. 91. 92. 93. 94. 95.
' Enlazar el BindingSource con el datatable anterior ' '''''''''''''''''''''''''''''''''''''''''''''''''' [Link] = dt With dv .Refresh() ' coloca el registro arriba de todo .FirstDisplayedScrollingRowIndex = [Link]
96. End With 97. 98. bEdit = False 99. 100. Catch exSql As SqlException 101. MsgBox([Link]) 102. Catch ex As Exception 103. MsgBox([Link]) 104. End Try 105. End Sub 106. 107. ' botn para guardar los cambios y llenar la grilla 108. Private Sub Button1_Click( _ 109. ByVal sender As [Link], _ 110. ByVal e As [Link]) Handles btn_Update.Cli ck 111. 112. Actualizar() 113. 114. End Sub 115. 116. 117. ' Eliminar el elemento actual del BindingSource y actua lizar 118. Private Sub btn_delete_Click( _ 119. ByVal sender As [Link], _ 120. ByVal e As [Link]) Handles btn_delete.Cli ck 121. 122. If Not [Link] Is Nothing Then 123. ' eliminar 124. [Link]() 125. 126. 'Guardar los cambios y recargar 127. Actualizar() 128. Else 129. MsgBox("No hay un registro actual para eliminar ", _ 130. [Link], _ 131. "Eliminar") 132. End If 133. 134. 135. End Sub 136. 137. Private Sub Actualizar(Optional ByVal bCargar As Boolea n = True) 138. ' Actualizar y guardar cambios 139. 140. If Not [Link] Is Nothing Then 141. [Link](CType([Link], Data Table)) 142. If bCargar Then 143. cargar_registros("Select * From alumnos Ord er by Apellido", DataGridView1)
144. End If 145. End If 146. End Sub 147. 148. Private Sub btn_first_Click( _ 149. ByVal sender As [Link], _ 150. ByVal e As [Link]) _ 151. Handles btn_first.Click, btn_last.Click, btn_ne [Link], btn_Previous.Click 152. 153. ' Botones para moverse por los registros 154. ' ''''''''''''''''''''''''''''''''''''''''''''' 155. 156. If sender Is btn_Previous Then 157. [Link]() 158. ElseIf sender Is btn_first Then 159. [Link]() 160. ElseIf sender Is btn_next Then 161. [Link]() 162. ElseIf sender Is btn_last Then 163. [Link]() 164. End If 165. 166. End Sub 167. 168. Private Sub DataGridView1_CellEndEdit( _ 169. ByVal sender As Object, _ 170. ByVal e As [Link] ntArgs) _ 171. Handles [Link] 172. 173. bEdit = True 174. End Sub 175. 176. ' nuevo registro 177. Private Sub btn_new_Click( _ 178. ByVal sender As [Link], _ 179. ByVal e As [Link]) Handles btn_new.Click 180. 181. 182. 183. 184. [Link]() End Sub End Class
Nota: establecer en el primer parmetro de la subRutina Filtrar_DatagridView, el nombre del campo por el cual filtrar ( debe ser un campo de tipo texto ) Cdigo fuente
Texto planoCopiar cdigo fuenteImprimir 1. Option Explicit On 2. Option Strict On 3. 4. ' espacio de nombres para poder acceder al cliente sql 5. Imports [Link] 6. Imports [Link] 7. 8. Public Class Form1 9. 10. ' enumeracin para las opciones que se usarn 11. ' para filtrar con el operador Like 12. Enum e_FILTER_OPTION 13. SIN_FILTRO = 0 14. CADENA_QUE_COMIENCE_CON = 1 15. CADENA_QUE_NO_COMIENCE_CON = 2 16. CADENA_QUE_CONTENGA = 3 17. CADENA_QUE_NO_CONTENGA = 4 18. CADENA_IGUAL = 5 19. End Enum 20. 21. ' cadena de conexin para SQL EXPRESS en modo local 22. Private Const cs As String = "Data Source=(local)\SQLEXPRESS ;" & _ 23. "Integrated Security=True;" & _ 24. os" 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. abla", cn) 42. 43. 44. 45. 46. 47. 48. 49. Dim dt As New DataTable ' crear un DataTable ' llenarlo [Link](dt) ' enlazar el DataTable al BindingSource [Link] = dt 'Instanciar el componente BindingSource Private BindingSource1 As [Link] = New BindingSource Private Sub Form1_Load( _ ByVal sender As [Link], _ ByVal e As [Link]) Handles [Link] Try ' Inicializar la conexin y abrir Using cn As SqlConnection = New SqlConnection(cs) [Link]() ' Inicializar DataAdapter indicando el sql para recuperar 'los registros de la tabla Dim da As New SqlDataAdapter("SELECT * FROM la_t "Initial Catalog=la_base_de_dat
50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.
' agregar las opciones al combobox With (ComboBox1) 'cargar los items de opciones para filtrar .[Link]("No filtrar") .[Link]("Que comience con") .[Link]("Que No comience con") .[Link]("Que contenga") .[Link]("Que No contenga") .[Link]("Que sea igual") .DropDownStyle = [Link] .SelectedIndex = 1 End With End Using ' errores Catch ex As Exception MsgBox([Link]) End Try End Sub Private Sub Aplicar_Filtro() ' filtrar por el campo Producto '''''''''''''''''''''''''''''''''''''''''''''''''''' Dim ret As Integer = Filtrar_DataGridView( _ "Producto", _ [Link], _ BindingSource1, _ DataGridView1, _ CType([Link] Index, e_FILTER_OPTION)) If ret = 0 Then ' si no hay registros cambiar el color del txtbox [Link] = [Link] Else [Link] = [Link] End If ' visualizar la cantidad de registros [Link] = ret & " Registros encontrados" End Sub
Function Filtrar_DataGridView( _ ByVal Columna As String, _ ByVal texto As String, _ ByVal BindingSource As BindingSource, _ ByVal DataGridView As DataGridView, _ Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothin g) As Integer 100. 101. ' verificar que el DataSource no est vacio 102. If [Link] Is Nothing Then 103. Return 0 104. End If 105. 106. Try 107. 108. Dim filtro As String = [Link] 109. 110. ' Seleccionar la opcin 111. Select Case Opcion_Filtro
112. N 113. 114. _CON 115. '" 116. 117. %'" 118. 119. 120. 121. 122. 123. 124. hen 125. 126. 127. 128. 129. 130. 131. 132. 133. BindingSource 134. 135. 136. rce 137. 138. 139. 140. 141. 142. 143. l) 144. 145. 146. 147. 148. 149. 150. 151. 152. hanged 153. 154. 155. 156. 157. End
Case e_FILTER_OPTION.CADENA_QUE_COMIENCE_CO filtro = "like '" & [Link] & "%'" Case e_FILTER_OPTION.CADENA_QUE_NO_COMIENCE filtro = "Not like '" & [Link] & "% Case e_FILTER_OPTION.CADENA_QUE_NO_CONTENGA filtro = "Not like '%" & [Link] & " Case e_FILTER_OPTION.CADENA_QUE_CONTENGA filtro = "like '%" & [Link] & "%'" Case e_FILTER_OPTION.CADENA_IGUAL filtro = "='" & [Link] & "'" End Select ' Opcin para no filtrar If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO T filtro = [Link] End If ' armar el sql If filtro <> [Link] Then filtro = "[" & Columna & "]" & filtro End If ' asigar el criterio a la propiedad Filter del [Link] = filtro ' enlzar el datagridview al BindingSource [Link] = [Link] ' retornar la cantidad de registros encontrados Return [Link] ' errores Catch ex As Exception MsgBox([Link], [Link] End Try Return 0 End Function Private Sub txt_Filtro_TextChanged( _ ByVal sender As [Link], _ ByVal e As [Link]) Handles [Link] Aplicar_Filtro() End Sub Class
Option Explicit On Option Strict On ' espacio de nombres para poder acceder al cliente sql Imports [Link] Imports [Link] Public Class Form1 ' enumeracin para las opciones que se usarn
El mismo ejemplo pero para filtrar un campo de tipo numrico Cdigo fuente con los mismos controles ( Nota : Indicar el nombre del campo )
Texto planoCopiar cdigo fuenteImprimir 1. Option Explicit On 2. Option Strict On 3. 4. Imports [Link] 5. Imports [Link] 6. 7. Public Class Form1 8. Enum e_FILTER_OPTION 9. SIN_FILTRO = 0 10. NUMERICO_MENOR = 1 11. NUMERICO_MAYOR = 2 12. NUMERICO_MENOR_IGUAL = 3 13. NUMERICO_MAYOR_IGUAL = 4 14. NUMERICO_IGUAL = 5 15. NUMERICO_DISTINTO = 6 16. End Enum 17. 18. Private Const cs As String = "Data Source=(local)\SQLEXPRESS ;" & _ 19. "Integrated Security=True;" & _ 20. os" 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 'Instanciar el componente BindingSource Private BindingSource1 As [Link] = New BindingSource Private Sub Form1_Load( _ ByVal sender As [Link], _ ByVal e As [Link]) Handles [Link] Try Using cn As SqlConnection = New SqlConnection(cs) [Link]() Dim da As New SqlDataAdapter("SELECT * FROM la_t abla", cn) Dim dt As New DataTable "Initial Catalog=la_base_de_dat
37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86.
[Link](dt) [Link] = dt With (ComboBox1) .[Link]("No filtrar") .[Link]("Menor") .[Link]("Mayor") .[Link]("Menor o igual") .[Link]("Mayor o igual") .[Link]("Igual") .[Link]("Distinto") .DropDownStyle = [Link] .SelectedIndex = 1 End With End Using Catch ex As Exception MsgBox([Link]) End Try End Sub Private Sub filtrar() ' filtrar por el campo Id de tipo numrico '''''''''''''''''''''''''''''''''''''''''''''''''''' Dim ret As Integer = Filtrar_DataGridView( _ "Id", _ [Link], _ BindingSource1, _ DataGridView1, _ CType([Link] Index, e_FILTER_OPTION)) If ret = 0 Then [Link] = [Link] Else [Link] = [Link] End If [Link] = ret & " Registros encontrados" End Sub
Function Filtrar_DataGridView( _ ByVal Columna As String, _ ByVal dato As String, _ ByVal BindingSource As BindingSource, _ ByVal DataGridView As DataGridView, _ Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothin g) As Integer 87. If [Link] Is Nothing Then 88. Return 0 89. End If 90. 91. Try 92. 93. Dim filtro As String = [Link] 94. 95. ' Seleccionar la opcin 96. Select Case Opcion_Filtro 97. Case e_FILTER_OPTION.NUMERICO_MENOR 98. filtro = "< " & [Link] & "" 99. Case e_FILTER_OPTION.NUMERICO_MAYOR
100. 101. 102. 103.
filtro = "> " & [Link] & "" Case e_FILTER_OPTION.NUMERICO_MENOR_IGUAL filtro = "<= " & [Link] & "" Case e_FILTER_OPTION.NUMERICO_MAYOR_IGUAL
104. filtro = ">= " & [Link] & "" 105. Case e_FILTER_OPTION.NUMERICO_IGUAL 106. filtro = "= " & [Link] & "" 107. Case e_FILTER_OPTION.NUMERICO_DISTINTO 108. filtro = "<> " & [Link] & "" 109. End Select 110. 111. ' Sin filtro 112. If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO O r Not IsNumeric([Link]) Then 113. filtro = [Link] 114. End If 115. 116. If filtro <> [Link] Then 117. filtro = "[" & Columna & "]" & filtro 118. End If 119. 120. [Link] = filtro 121. 122. [Link] = [Link] rce 123. Return [Link] 124. 125. Catch ex As Exception 126. MsgBox([Link], [Link] l) 127. End Try 128. 129. Return 0 130. 131. End Function 132. 133. Private Sub txt_Filtro_TextChanged( _ 134. ByVal sender As [Link], _ 135. ByVal e As [Link]) Handles [Link] hanged 136. 137. filtrar() 138. 139. End Sub 140. 141. Private Sub Combo1_SelectedIndexChanged( _ 142. ByVal sender As [Link], _ 143. ByVal e As [Link]) Handles [Link] ctedIndexChanged 144. filtrar() 145. End Sub 146. End Class
Option Explicit On Option Strict On Imports [Link] Imports [Link] Public Class Form1 Enum e_FILTER_OPTION SIN_FILTRO = 0 NUMERICO_MENOR = 1
Nota: si se quiere filtrar por varios campos, se debe indicar al filter la condicin por ejemplo de la siguiente manera.
BindingSource .Filter = "[nombre 'Nombre' And [Precio] <= 500"
Producto]
Alternat colunas con diferentes colores
1. Option Explicit On 2. Option Strict On 3. 4. Public Class Form1 5. 6. Private Sub Form1_Load( _ 7. ByVal sender As [Link], _ 8. ByVal e As [Link]) Handles [Link] 9. 10. 11. [Link] = "Alternar color de fila" 12. 13. 14. ' Agregar 3 headers 15. With DataGridView1 16. 17. .[Link]("Id Factura", "Id Factura") 18. .[Link]("Fecha", "Fecha") 19. .[Link]("Vencimiento", "Vencimiento") 20. 21. ' Cargar algunos items en el DataGridView 22. '''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''' 23. .RowCount = 100 24. 25. For Fila As Integer = 0 To .RowCount - 1 26. .Item(0, Fila).Value = Fila 27. .Item(1, Fila).Value = [Link](Fila).To ShortDateString 28. .Item(2, Fila).Value = [Link](Fila + 1 0).ToShortDateString
29. 30. 31.
Next
' Establecer el RowsDefaultCellStyle color de fondo de las celdas 32. .[Link] = [Link] 33. 34. ' alineacin para la columna 1 35. .Columns(0).[Link] = DataGridVie [Link] 36. 37. End With 38. End Sub 39. 40. Private Sub CheckBox1_CheckedChanged( _ 41. ByVal sender As [Link], _ 42. ByVal e As [Link]) Handles [Link] anged 43. With DataGridView1 44. 45. ' alternar colores 46. If [Link] Then 47. 48. .[Link] = [Link] 49. 50. .[Link] = Col [Link] 51. 52. 53. Else ' Sin alternar 54. .[Link] = .Ro [Link] 55. End If 56. End With 57. 58. End Sub 59. End Class
Crear un nuevo proyecto, aadir un windows Form, un control DataGridView llamado DataGridview1 Cdigo fuente
Texto planoCopiar cdigo fuenteImprimir 1. Option Explicit On 2. Option Strict On 3. 4. Public Class Form1 5. 6. Private Sub Form1_Load( _ 7. ByVal sender As [Link], _ 8. ByVal e As [Link]) Handles [Link] 9. 10. ' llenar la cuadricula con valores 11. With DataGridView1 12. 13. .[Link]() 14. ' agregar cabeceras 15. .[Link]("Productos", "Productos") 16. .[Link]("stock", "stock Actual") 17. .[Link]("Fecha", "Fecha") 18. .[Link]("Id", "Id Proveedor") 19. 20. 21. Dim random_stock As New Random 22. 23. ' agregar filas 24. For i As Integer = 1 To 20 25. .[Link]("Producto n " & i, _ 26. random_stock.Next(25, 500), _ 27. [Link](i).ToShortDateString , _ 28. i) 29. Next 30. 31. ' Bloquear la Columna fecha 32. .Columns("fecha").ReadOnly = True 33. 34. End With 35. End Sub 36. 37. Private Sub dataGridView1_EditingControlShowing( _ 38. ByVal sender As Object, _ 39. ByVal e As DataGridViewEditingControlShowingEventArgs) _ 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Handles [Link] ' referencia a la celda Dim validar As TextBox = CType([Link], TextBox) ' agregar el controlador de eventos para el KeyPress AddHandler [Link], AddressOf validar_Keypress End Sub ' evento Keypress ' ''''''''''''''''''' Private Sub validar_Keypress( _ ByVal sender As Object, _ ByVal e As [Link])
56. 57. nIndex 58. 59.
' obtener indice de la columna Dim columna As Integer = [Link]
' comprobar si la celda en edicin corresponde a la colu mna 1 o 3 60. If columna = 1 Or columna = 3 Then 61. 62. ' Obtener caracter 63. Dim caracter As Char = [Link] 64. 65. ' comprobar si el caracter es un nmero o el retroce so 66. If Not [Link](caracter) And (caracter = ChrW( [Link])) = False Then 67. '[Link] = [Link] 68. [Link] = Chr(0) 69. End If 70. End If 71. End Sub 72. End Class
Option Explicit On Option Strict On Public Class Form1 Private Sub Form1_Load( _ ByVal sender As [Link], _ ByVal e As [Link]) Handles [Link] ' llenar la cuadricula con valores
Ejemplo para poder aceptar el separador decimal para los nmeros
Texto planoCopiar cdigo fuenteImprimir 1. Dim columna As Integer = [Link] 2. 3. ' verificar columna actual 4. If columna = 1 Or columna = 3 Then 5. Dim caracter As Char = [Link] 6. 7. ' referencia a la celda 8. Dim txt As TextBox = CType(sender, TextBox) 9. 10. ' comprobar si es un nmero con isNumber, si es el backspace , si el caracter 11. ' es el separador decimal, y que no contiene ya el separador 12. 13. 14. 15. 16. 17. 18. 19. 20. If ([Link](caracter)) Or _ (caracter = ChrW([Link])) Or _ (caracter = ",") And _ ([Link](",") = False) Then [Link] = False Else [Link] = True
21. End If 22. End If
Dim dtbTabla As New [Link] dtbTabla = [Link]("persona") [Link]("nombre") [Link]("apellido") [Link]("documento") [Link]("telefono") Dim dtrFila As DataRow dtrFila = [Link]() dtrFila("nombre") = "Pepito" dtrFila("apellido") = "Perez" dtrFila("documento") = "31548588" dtrFila("telefono") = "24545454" [Link](dtrFila) [Link] = [Link]("persona")
He encontrado una solucin que tal vez no sea tan buena porque se invierten varias lineas de cdigo pero resulta til de todas formas Agregamos una nueva columna al datagridview [Link]() Y luego recorremos la grilla por cada celda para insertar el texto en la columna respectiva [Link](0).cells(0).value= "texto1" [Link](0).cells(1).value= "texto2" [Link](0).cells(2).value= "texto3" [Link](0).cells(3).value= "texto4" [Link](0).cells(4).value= "texto5
de Eliminar fila Private Sub Columna_Click(ByVal sender As Object, ByVal e As [Link]) Handles [Link] ' Eliminar una linia del DataGrid [Link]([Link]) End Sub
Private Sub btnAgregar_Click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] If [Link] <> "" Then If [Link] <> "" Then agregamos la informacion a un row o fila del datagrid [Link]([Link], [Link], [Link]) limpiamos los controles [Link] = "" [Link] = "" [Link] = [Link] Else [Link]("Ingrese un deporte", "", [Link], [Link]) End If Else [Link]("Ingrese un nombre", "", [Link], [Link]) End If End Sub
Private Sub dgvEjemplo_CellContentClick(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] se puede hacer referencia al nombre de la columna para saber donde hicieron click o solo con el [Link] sabiendo la posicion de la columna yo lo manejo asi por que se daran cuenta que en algun caso las columnas pueden aumentar o disminuir y se complicaria la cosa por que si cambia el numero de columnas habria que corregir siembre el indice
si hicieron clic en la columna eliminar
If [Link]([Link]).Name = "Eliminar" Then eliminar row [Link]([Link]) End If End Sub
Private Sub btnGuardar_Click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] If [Link] > 0 Then Dim SqlString As String = "" variable a la que asignaremos la sentencia Dim ListSqlStrings As New ArrayList arregla donde ingresaremos las sentencias recorremos el datagrid como ya sabemos siempre se toma desde cero For i As Integer = 0 To [Link] - 1 creamos la sentencia el row siempre tendra el valor de i para ir pasando de row en row el campo .cells(0) indica la columna que esta ese dato, tambien puede hacerlo con el nombre de la celda .cells("Nombre") SqlString = "INSERT INTO datos (nombre,deporte,fecha_inscripcion) VALUES (" + [Link](i).Cells(0).[Link]() + "," + [Link](i).Cells(1).[Link]() + "," + [Link](i).Cells(2).[Link]() + ")" agregamos la sentencia a la lista [Link](SqlString) Next If EjecutarTransaccion(ListSqlStrings) Then [Link]("Info. guardada correctamente") Close() Else [Link]("La Info. no se guardo") End If Else
[Link]("No hay informacion para guardar") End If End Sub
Public Function EjecutarTransaccion(ByVal ListaSentencias As ArrayList) As Boolean Dim band As Boolean = False If AbrirConexion() Then Dim command As SqlCommand = [Link]() Dim transaction As SqlTransaction Dim strSentencia As Object Dim sentencia As String = "" transaction = [Link]() [Link] = Connection [Link] = transaction Try For Each strSentencia In ListaSentencias sentencia = [Link]() [Link] = [Link]() [Link]() Next [Link]() band = True Catch ex As Exception [Link]([Link]) Try [Link]() Catch ex2 As Exception
[Link]([Link]) End Try Finally CerrarConexion() End Try End If Return band End Function
La clase DataGridViewCell
Esta clase representa una celda individual existente en un control DataGridView , que podemos referenciar fcilmente efectuando una simple consulta a la propiedad CurrentCell del control DataGridView :
' Referenciamos la celda actual ' Dim dgvCell As DataGridViewCell = [Link]
De esta manera ya estamos en condiciones de obtener el valor de las restantes propiedades de la celda, como el ndice de la columna (ColumnIndex ), el ndice de la fila (RowIndex ), o el valor de la celda (Value ). Pero tambin podemos conocer igualmente, el tipo de control de edicin que se aloja en la celda mediante la propiedad EditType del control DataGridView , que dependiendo del tipo asignado a la columna, en principio puede corresponderse con alguna de las siguientes clases: Tipos de columnas DataGridViewButtonColumn Tipos de objetos existentes en las celdas DataGridViewButtonCell
DataGridViewCheckBoxColumn DataGridViewComboBoxColumn DataGridViewImageColumn DataGridViewLinkColumn DataGridViewTextBoxColumn
DataGridViewCheckBoxCell DataGridViewComboBoxCell DataGridViewImageCell DataGridViewLinkCell DataGridViewTextBoxCell
Parece ser que el nombre de cada clase denota bien el tipo de control que representan las columnas y celdas del control DataGridView . Cuando referenciamos una celda cualquiera del control DataGridView , automticamente obtendremos el tipo de control alojado en ella, que se corresponder con el tipo de control asignado a la columna a la que pertenece la celda. Continuando con el ejemplo anterior, si la celda actual se encuentra en una columna tipo DataGridViewCheckBo xColumn , la variable objeto dgvCell referenciar a un objeto DataGridViewCheckBo xCell , y si la columna es del tipo DataGridViewTextBoxColumn , el tipo de objeto de la celda ser DataGridViewTextBoxCell .
La clase DataGridViewTextBoxCell
Esta clase es la encargada de mostrar texto modificable en una celda del control DataGridView , y es la clase que por defecto tendrn todas las celdas existententes en dicho control, salvo que expresamente le hayamos asignado a la columna otro tipo de clase DataGridViewXXXColumn de las mencionadas en el apartado anterior, en cuyo caso, las celdas de esa columna sern del tipo de objeto especializado. La clase DataGridViewTextBoxCell hereda directamente de la clase base DataGridViewCell, de la que toma la inmensa mayora de sus propiedades y mtodos. Si nuestra intencin es referenciar el objeto DataGridViewTextBoxCell alojado en la celda actual del control DataGridView , ejecutaramos algo parecido a lo siguiente:
' Referenciamos el control DataGridViewTextBoxCell actual ' Dim textBoxCell As DataGridViewTextBoxCell = _ TryCast([Link], DataGridViewTextBoxCell)
La importancia de esta clase radica en que la celda actualmente seleccionada, aloja a su vez un control de la clase DataGridViewTextBoxEditingControl , que es el control que nos permite editar el valor de la celda, siempre y cuando el valor de la propiedad ReadOnly del control DataGridViewTextBoxCell sea False .
El control DataGridViewTextBoxEditingControl
Por fin hemos llegado al objeto ms recndito de la celda; al objeto DataGridViewTextBoxEditingControl alojado en el objeto DataGridViewTextBoxCell existente a su vez en el objeto DataGridViewCell , representado ste por la celda actual del control DataGridView . Desde luego, no me extraa que con tantos nombres parecidos, y de gran longitud, ms de uno se haga un pequeo lo. Pero cuando se hayan peleado un par de veces con las celdas del control DataGridView , les aseguro que vern las cosas de otra manera. Como bien nos d a entender el nombre del control DataGridViewTextBoxEditingControl , ste hereda directamente del clsico control de edicin de Visual Basic, el control TextBox, por tanto, implementa todas las propiedades, mtodos y eventos de ste ltimo control, permitindonos editar el contenido de la celda. Cuando una celda cualquiera del control DataGridView pasa a modo de edicin, se desencadena el evento EditingControlS howing , donde el segundo parmetro de su firma es un objeto de la clase DataGridViewEdit ingCo ntrolShowingEventArgs (otro nombre ms largo an para aadir a la lista). Esta clase dispone nicamente de dos propiedades pblicas: CellStyle (un objeto DataGridViewCellStyle que referencia a la celda editada), y Control (que es el control proporcionado para editar el valor de la celda). Ser de la propiedad Control donde obtendremos el escndido control DataGridViewTextBoxEditingControl , tal y como se muestra en el siguiente ejemplo:
Private Sub DataGridView1_EditingControlShowing( _ ByVal sender As Object, _ ByVal e As DataGridViewEditingControlShowingEventArgs) _ Handles [Link]
' Referenciamos el control TextBox subyacente en la celda actual. ' Dim cellTextBox As DataGridViewTextBoxEditingControl
cellTextBox = TryCast([Link], DataGridViewTextBoxEditingControl)
' Obtenemos el valor actual de la celda. ' [Link]([Link])
' Obtenemos el estilo de la celda actual ' Dim style As DataGridViewCellStyle = [Link]
' Mientras se edita la celda, aumentaremos la fuente ' y rellenaremos el color de fondo de la celda actual. ' With style .Font = New Font([Link], 10, [Link]) .BackColor = [Link] End With
End Sub
El resultado ser el que se muestra en la imagen, donde se observa que la celda cambia a otro color de fondo y se aumenta el tamao de la fuente, mientras se est editando.
Una vez que hemos sido capaces de referenciar el objeto derivado de la clase TextBox existente en una celda, por qu no vamos a ser capaces de controlar las pulsaciones de teclas que se efectan en el mismo, si en definitiva se trata de un simple control TextBox? La solucin se encuentra en instalar los correspondientes controladores para los tres eventos del teclado del control TextBox: KeyDown , KeyPress y KeyUp . En el ejemplo anterior, la variable cellTextBox est declarada a nivel del propio procedimiento que la contiene, por lo su mbito es local. Es cierto que en el mismo procedimiento podemos instalar los correspondientes controladores de evento mediante la instruccin AddHandler , pero cada vez que se edite una celda, se estar instalado un controlador, y si se editan 20.000 celdas, se instalarn 20.000 controladores, que desencadenarn 20.000 eventos, que en el caso de estar instalados para los tres eventos de teclado, producirn 60.000 eventos de teclado. Para evitar que se instale un controlador cada vez que se edita una celda, habra que eliminar el controlador con la instruccin RemoveHandler , por ejemplo, en el evento CellEndEdit del control DataGridView , que se produce cuando finalice la edicin de la celda. Pero, claro! Esto ltimo tiene un gran inconveniente, porque si eliminamos el controlador de evento en otro procedimiento distinto (CellEndEdit ) a aquel donde se ha instalado
(EditingControlShowing ), necesitaremos una variable objeto con un mbito superior al local para poder eliminar el controlador de evento. La solucin pasa por declarar a nivel del propio formulario que contiene el control DataGridView , una variable objeto que ser la que sucesivamente estar referenciando al control DataGridViewTextBoxEditingControl de la celda que actualmente se encuentre en modo de edicin, y declararemos la variable objeto con la palabra clave WithEvents , para no tener que aadir y eliminar manualmente los controladores para los tres eventos de teclado, tal y como muestro a continuacin:
Private WithEvents cellTextBox As DataGridViewTextBoxEditingControl
Private Sub cellTextBox_KeyDown( _ ByVal sender As Object, _ ByVal e As [Link]) Handles [Link]
End Sub
Private Sub cellTextBox_KeyPress( _ ByVal sender As Object, _ ByVal e As [Link]) Handles [Link]
End Sub
Private Sub cellTextBox_KeyUp( _ ByVal sender As Object, _ ByVal e As [Link]) Handles [Link]
End Sub
Private Sub DataGridView1_EditingControlShowing( _ ByVal sender As Object, _ ByVal e As DataGridViewEditingControlShowingEventArgs) _ Handles [Link]
' Este evento se producir cuando la celda pasa ' a modo de edicin.
' Referenciamos el control DataGridViewTextBoxEditingControl actual. ' cellTextBox = TryCast([Link], DataGridViewTextBoxEditingControl)
' Obtenemos el estilo de la celda actual ' Dim style As DataGridViewCellStyle = [Link]
' Mientras se edita la celda, aumentaremos la fuente ' y rellenaremos el color de fondo de la celda actual. ' With style .Font = New Font([Link], 10, [Link]) .BackColor = [Link] End With
End Sub
Cmo declarar un objeto DataGridViewTextBoxEditingControl para ser utilizado por los eventos del teclado
Bueno. Ya est en condiciones de detectar la tecla pulsada en cualquier celda del control DataGridView que se encuentre actualmente en modo de edicin. Los eventos correspondientes al control de edicin de la celda, unidos a los tres eventos del teclado del propio control DataGridView , en teora nos debe de dar toda la flexibilidad posible para detectar las teclas que el usuario ha presionado. A continuacin paso a exponer algunos ejemplos para trabajar con los eventos del teclado descritos, dependiendo de ciertas acciones en concreto. Con total seguridad, en la Red de redes existirn miles de ejemplos mejores que los que encontrar aqu, pero lo que slo pretendo es mostrarle simplemente una manera ms de realizar una operacin concreta, que no quiere decir que sea la mejor.
Permitir slo nmeros, el carcter separador decimal, y el carcter negativo, en las celdas de un control DataGridView.
Si en nuestro control DataGridView tenemos una columna donde nos interesara que slo se introdujeran datos numricos (enteros o decimales), controlaramos la pulsacin de teclas en el evento KeyPress del objeto DataGridViewTextBoxEditingControl declarado a nivel del formulario. Por supuesto que el ejemplo tambin servira para permitir los citados caracteres en un simple control TextBox, que como se ha explicado en el artculo, es el control que existe en las celdas de un control DataGridView .
Private Sub cellTextBox_KeyPress( _ ByVal sender As Object, _ ByVal e As [Link]) Handles [Link]
Dim isDecimal, isMinus, isValidChar As Boolean Dim separadorDecimal As String = Nothing
Select Case [Link] Case "."c, ","c
' Obtenemos el carcter separador decimal existente ' actualmente en la configuracin regional de Windows. ' separadorDecimal = _ [Link]. _ [Link]
' Hacemos que el carcter tecleado coincida con el ' carcter separador existentente en la configuracin ' regional. ' [Link] = [Link](0)
' Es un carcter vlido. ' isDecimal = True isValidChar = True
Case "-"c ' Es un carcter vlido. ' isMinus = True isValidChar = True
Case Else ' Slo se admitirn nmeros y la tecla de retroceso. ' Dim isDigit As Boolean = [Link]([Link]) Dim isControl As Boolean = [Link]([Link])
If ((isDigit) OrElse (isControl)) Then isValidChar = True
Else [Link] = True Return
End If
End Select
' Referenciamos el control TextBox subyacente. ' Dim tb As TextBox = TryCast(sender, TextBox)
' Si la conversin ha fallado, abandonamos el procedimiento. ' If (tb Is Nothing) Then [Link] = True Return End If
' Si es un carcter vlido, y el texto del control ' se encuentra totalmente seleccionado, elimino ' el valor actual del control. ' If ((isValidChar) And ([Link] = [Link])) Then [Link] = [Link] End If
If (isMinus) Then ' Admitimos el carcter negativo, siempre y cuando ' sea el primer carcter del texto, y no exista ya ' ningn otro signo negativo. ' If (([Link] <> 0) OrElse ([Link]("-"c) >= 0)) Then [Link] = True Return End If
End If
If (isDecimal) Then ' Si en el control hay ya escrito un separador decimal, ' deshechamos insertar otro separador ms. ' If ([Link](separadorDecimal) >= 0) Then [Link] = True Return End If End If
End Sub
Como bien podr comprobar, el ejemplo tiene en cuenta el carcter separador decimal existente en la configuracin regional del usuario, que en algunos casos ser el punto (.), y en otros la coma (,). Asimismo, tambin tiene en cuenta si se desea introducir un numro negativo, que slo se permitir si el signo menos (-) es el primer carcter existente en la celda o en el control TextBox.