sumar datos
TRANSCRIPT
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 System.EventArgs) Handles MyBase.Load 9. Me.Text = "Sumar columnas en DataGridview" 10. Button1.Text = "Sumar" 11. Button2.Text = "Cargar valores" 12. End Sub 13. 14. ' función 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 Dgv.RowCount - 1 24. total = total + CDb
l(Dgv.Item(nombre_Columna.ToLower, i).Value) 25. Next 26. 27. Catch ex As Exception 28. MsgBox(ex.Message.ToString) 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 System.Object, _ 38. ByVal e As System.EventArgs) Handles Button1.Click 39. 40. ' muostrar el total de la suma en el control Label para
la columna llamada Costo 41. Label1.Text = "Total :" & Format(Sumar("costo", DataGrid
View1), "c").ToString 42. End Sub 43. 44. Private Sub Button2_Click( _ 45. ByVal sender As System.Object, _ 46. ByVal e As System.EventArgs) Handles Button2.Click 47. 48. Randomize() 49. 50. With DataGridView1 51. ' Agregar dos columnas 52. .Columns.Clear() 53. .Columns.Add("Id", "Id Producto") 54. .Columns.Add("Costo", "Costo") 55. ' agregar 10 filas 56. .RowCount = 10 57. 58. ' añadir un valor para el campo ID 59. For Filas As Integer = 0 To .RowCount - 1 60. .Item(0, Filas).Value = Filas
61. Next 62. 63. ' añadir un valor aleatorio para el campo Costo 64. For Filas As Integer = 0 To .RowCount - 1 65. .Item(1, Filas).Value = Format(CInt(Rnd() * 2500
), "c") 66. Next 67. End With 68. End Sub
Código fuente
Texto plano Copiar código fuente Imprimir
1. Option Explicit On 2. Option Strict On 3. 4. ' Espacios de nombres 5. ' ''''''''''''''''''''''''''''''''''''''''' 6. Imports System.Data.SqlClient 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 conexión 17. Private Const cs As String = "Data Source=(local)\
SQLEXPRESS;" & _ 18. "Initial Catalog=demo_bd;" & _ 19. "Integrated Security=true" 20. 21. ' flag 22. Private bEdit As Boolean 23. 24. 25. ' actualizar los cambios al salir 26. ' '''''''''''''''''''''''''''''''''''''''' 27. Private Sub Form1_FormClosing( _ 28. ByVal sender As Object, _ 29. ByVal e As System.Windows.Forms.FormClosingEventArgs) _ 30. Handles Me.FormClosing
31. 32. If bEdit Then 33. 'preguntar si se desea guardar 34. If (MsgBox( _ 35. "Guardar cambios ?", _ 36. MsgBoxStyle.YesNo, _ 37. "guardar")) = MsgBoxResult.Yes Then 38. 39. Actualizar(False) 40. End If 41. End If 42. End Sub 43. 44. Private Sub Form1_Load( _ 45. ByVal sender As System.Object, _ 46. ByVal e As System.EventArgs) Handles MyBase.Load 47. 48. ' propiedades del datagrid 49. ' ''''''''''''''''''''''''''''''''''''' 50. With DataGridView1 51. ' alternar color de filas 52. .AlternatingRowsDefaultCellStyle.BackColor = Color.F
loralWhite 53. .DefaultCellStyle.BackColor = Color.Beige 54. ' Establecer el origen de datos para el DataGridview 55. .DataSource = bs 56. End With 57. 58. ' botones 59. ' ''''''''''''''''''''''''''''''''''''' 60. btn_Update.Text = "Guardar cambios" 61. btn_delete.Text = "Eliminar registro" 62. btn_new.Text = "Nuevo" 63. 64. btn_first.Text = "<<" 65. btn_Previous.Text = "<" 66. btn_next.Text = ">" 67. btn_last.Text = ">>" 68. 69. ' cagar los datos 70. cargar_registros("Select * From alumnos Order by Apellid
o", DataGridView1) 71. 72. End Sub 73. 74. Private Sub cargar_registros( _ 75. ByVal sql As String, _ 76. ByVal dv As DataGridView) 77. 78. Try 79. ' 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. SqlDataAdapter.Fill(dt) 87. 88. ' Enlazar el BindingSource con el datatable anterior 89. ' ''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''' 90. bs.DataSource = dt 91.
92. With dv 93. .Refresh() 94. ' coloca el registro arriba de todo 95. .FirstDisplayedScrollingRowIndex = bs.Position 96. End With 97. 98. bEdit = False 99. 100. Catch exSql As SqlException 101. MsgBox(exSql.Message.ToString) 102. Catch ex As Exception 103. MsgBox(ex.Message.ToString) 104. End Try 105. End Sub 106. 107. ' botón para guardar los cambios y llenar la grilla 108. Private Sub Button1_Click( _ 109. ByVal sender As System.Object, _ 110. ByVal e As System.EventArgs) 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 System.Object, _ 120. ByVal e As System.EventArgs) Handles btn_delete.Cli
ck 121. 122. If Not bs.Current Is Nothing Then 123. ' eliminar 124. bs.RemoveCurrent() 125. 126. 'Guardar los cambios y recargar 127. Actualizar() 128. Else 129. MsgBox("No hay un registro actual para eliminar
", _ 130. MsgBoxStyle.Exclamation, _ 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 bs.DataSource Is Nothing Then 141. SqlDataAdapter.Update(CType(bs.DataSource, 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 System.Object, _ 150. ByVal e As System.EventArgs) _
151. Handles btn_first.Click, btn_last.Click, btn_next.Click, btn_Previous.Click
152. 153. ' Botones para moverse por los registros 154. ' ''''''''''''''''''''''''''''''''''''''''''''' 155. 156. If sender Is btn_Previous Then 157. bs.MovePrevious() 158. ElseIf sender Is btn_first Then 159. bs.MoveFirst() 160. ElseIf sender Is btn_next Then 161. bs.MoveNext() 162. ElseIf sender Is btn_last Then 163. bs.MoveLast() 164. End If 165. 166. End Sub 167. 168. Private Sub DataGridView1_CellEndEdit( _ 169. ByVal sender As Object, _ 170. ByVal e As System.Windows.Forms.DataGridViewCellEve
ntArgs) _ 171. Handles DataGridView1.CellEndEdit 172. 173. bEdit = True 174. End Sub 175. 176. ' nuevo registro 177. Private Sub btn_new_Click( _ 178. ByVal sender As System.Object, _ 179. ByVal e As System.EventArgs) Handles btn_new.Click 180. 181. bs.AddNew() 182. 183. End Sub 184. End Class
Nota: establecer en el primer parámetro de la subRutina Filtrar_DatagridView, el nombre del campo por el cual filtrar ( debe ser un campo de tipo texto )
Código fuente
Texto plano Copiar código fuente Imprimir
1. Option Explicit On 2. Option Strict On 3. 4. ' espacio de nombres para poder acceder al cliente sql 5. Imports System.Data 6. Imports System.Data.SqlClient 7. 8. Public Class Form1 9. 10. ' enumeración para las opciones que se usarán 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 conexión para SQL EXPRESS en modo local 22. Private Const cs As String = "Data Source=(local)\
SQLEXPRESS;" & _ 23. "Integrated Security=True;" & _ 24. "Initial Catalog=la_base_de_dat
os" 25. 26. 'Instanciar el componente BindingSource 27. Private BindingSource1 As Windows.Forms.BindingSource = New
BindingSource 28. 29. Private Sub Form1_Load( _ 30. ByVal sender As System.Object, _ 31. ByVal e As System.EventArgs) Handles MyBase.Load 32. 33. 34. Try 35. ' Inicializar la conexión y abrir 36. Using cn As SqlConnection = New SqlConnection(cs) 37. cn.Open() 38. 39. ' Inicializar DataAdapter indicando el sql para
recuperar 40. 'los registros de la tabla 41. Dim da As New SqlDataAdapter("SELECT * FROM la_t
abla", cn) 42. Dim dt As New DataTable ' crear un DataTable 43. 44. ' llenarlo 45. da.Fill(dt) 46. 47. ' enlazar el DataTable al BindingSource 48. BindingSource1.DataSource = dt 49. 50. ' agregar las opciones al combobox 51. With (ComboBox1) 52. 53. 'cargar los items de opciones para filtrar 54. .Items.Add("No filtrar") 55. .Items.Add("Que comience con") 56. .Items.Add("Que No comience con") 57. .Items.Add("Que contenga") 58. .Items.Add("Que No contenga") 59. .Items.Add("Que sea igual")
60. 61. .DropDownStyle = ComboBoxStyle.DropDownList 62. .SelectedIndex = 1 63. End With 64. End Using 65. ' errores 66. Catch ex As Exception 67. MsgBox(ex.Message.ToString) 68. End Try 69. End Sub 70. 71. 72. Private Sub Aplicar_Filtro() 73. 74. ' filtrar por el campo Producto 75. '''''''''''''''''''''''''''''''''''''''''''''''''''' 76. Dim ret As Integer = Filtrar_DataGridView( _ 77. "Producto", _ 78. TextBox1.Text.Trim, _ 79. BindingSource1, _ 80. DataGridView1, _ 81. CTyp
e(ComboBox1.SelectedIndex, e_FILTER_OPTION)) 82. 83. If ret = 0 Then 84. ' si no hay registros cambiar el color del txtbox 85. TextBox1.BackColor = Color.Red 86. Else 87. TextBox1.BackColor = Color.White 88. End If 89. ' visualizar la cantidad de registros 90. Me.Text = ret & " Registros encontrados" 91. 92. End Sub 93. 94. Function Filtrar_DataGridView( _ 95. ByVal Columna As String, _ 96. ByVal texto As String, _ 97. ByVal BindingSource As BindingSource, _ 98. ByVal DataGridView As DataGridView, _ 99. Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothin
g) As Integer 100. 101. ' verificar que el DataSource no esté vacio 102. If BindingSource1.DataSource Is Nothing Then 103. Return 0 104. End If 105. 106. Try 107. 108. Dim filtro As String = String.Empty 109. 110. ' Seleccionar la opción 111. Select Case Opcion_Filtro 112. Case e_FILTER_OPTION.CADENA_QUE_COMIENCE_CO
N 113. filtro = "like '" & texto.Trim & "%'" 114. Case e_FILTER_OPTION.CADENA_QUE_NO_COMIENCE
_CON 115. filtro = "Not like '" & texto.Trim & "%
'" 116. Case e_FILTER_OPTION.CADENA_QUE_NO_CONTENGA 117. filtro = "Not like '%" & texto.Trim & "
%'" 118. Case e_FILTER_OPTION.CADENA_QUE_CONTENGA 119. filtro = "like '%" & texto.Trim & "%'"
120. Case e_FILTER_OPTION.CADENA_IGUAL 121. filtro = "='" & texto.Trim & "'" 122. End Select 123. ' Opción para no filtrar 124. If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO T
hen 125. filtro = String.Empty 126. End If 127. 128. ' armar el sql 129. If filtro <> String.Empty Then 130. filtro = "[" & Columna & "]" & filtro 131. End If 132. 133. ' asigar el criterio a la propiedad Filter del
BindingSource 134. BindingSource.Filter = filtro 135. ' enlzar el datagridview al BindingSource 136. DataGridView.DataSource = BindingSource.DataSou
rce 137. 138. ' retornar la cantidad de registros encontrados 139. Return BindingSource.Count 140. 141. ' errores 142. Catch ex As Exception 143. MsgBox(ex.Message.ToString, MsgBoxStyle.Critica
l) 144. End Try 145. 146. Return 0 147. 148. End Function 149. 150. Private Sub txt_Filtro_TextChanged( _ 151. ByVal sender As System.Object, _ 152. ByVal e As System.EventArgs) Handles textbox1.TextC
hanged 153. 154. Aplicar_Filtro() 155. 156. End Sub 157. End Class
El mismo ejemplo pero para filtrar un campo de tipo numérico
Código fuente con los mismos controles
( Nota : Indicar el nombre del campo )
Option Explicit OnOption Strict On
' espacio de nombres para poder acceder al cliente sqlImports System.DataImports System.Data.SqlClient
Public Class Form1
' enumeración para las opciones que se usarán
Texto plano Copiar código fuente Imprimir
1. Option Explicit On 2. Option Strict On 3. 4. Imports System.Data 5. Imports System.Data.SqlClient 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. "Initial Catalog=la_base_de_dat
os" 21. 22. 'Instanciar el componente BindingSource 23. Private BindingSource1 As Windows.Forms.BindingSource = New
BindingSource 24. 25. Private Sub Form1_Load( _ 26. ByVal sender As System.Object, _ 27. ByVal e As System.EventArgs) Handles MyBase.Load 28. 29. 30. Try 31. 32. Using cn As SqlConnection = New SqlConnection(cs) 33. cn.Open() 34. 35. Dim da As New SqlDataAdapter("SELECT * FROM la_t
abla", cn) 36. Dim dt As New DataTable 37. 38. da.Fill(dt) 39. 40. 41. BindingSource1.DataSource = dt 42. With (ComboBox1) 43. .Items.Add("No filtrar") 44. .Items.Add("Menor") 45. .Items.Add("Mayor") 46. .Items.Add("Menor o igual") 47. .Items.Add("Mayor o igual") 48. .Items.Add("Igual") 49. .Items.Add("Distinto") 50. 51. .DropDownStyle = ComboBoxStyle.DropDownList 52. .SelectedIndex = 1 53. End With 54. End Using 55. Catch ex As Exception 56. MsgBox(ex.Message.ToString) 57. End Try 58. End Sub 59. 60.
61. Private Sub filtrar() 62. 63. ' filtrar por el campo Id de tipo numérico 64. '''''''''''''''''''''''''''''''''''''''''''''''''''' 65. Dim ret As Integer = Filtrar_DataGridView( _ 66. "Id", _ 67. TextBox1.Text.Trim, _ 68. BindingSource1, _ 69. DataGridView1, _ 70. CTyp
e(ComboBox1.SelectedIndex, e_FILTER_OPTION)) 71. 72. If ret = 0 Then 73. TextBox1.BackColor = Color.Red 74. Else 75. TextBox1.BackColor = Color.White 76. End If 77. Me.Text = ret & " Registros encontrados" 78. 79. End Sub 80. 81. Function Filtrar_DataGridView( _ 82. ByVal Columna As String, _ 83. ByVal dato As String, _ 84. ByVal BindingSource As BindingSource, _ 85. ByVal DataGridView As DataGridView, _ 86. Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothin
g) As Integer 87. If BindingSource1.DataSource Is Nothing Then 88. Return 0 89. End If 90. 91. Try 92. 93. Dim filtro As String = String.Empty 94. 95. ' Seleccionar la opción 96. Select Case Opcion_Filtro 97. Case e_FILTER_OPTION.NUMERICO_MENOR 98. filtro = "< " & dato.Trim & "" 99. Case e_FILTER_OPTION.NUMERICO_MAYOR 100. filtro = "> " & dato.Trim & "" 101. Case e_FILTER_OPTION.NUMERICO_MENOR_IGUAL 102. filtro = "<= " & dato.Trim & "" 103. Case e_FILTER_OPTION.NUMERICO_MAYOR_IGUAL 104. filtro = ">= " & dato.Trim & "" 105. Case e_FILTER_OPTION.NUMERICO_IGUAL 106. filtro = "= " & dato.Trim & "" 107. Case e_FILTER_OPTION.NUMERICO_DISTINTO 108. filtro = "<> " & dato.Trim & "" 109. End Select 110. 111. ' Sin filtro 112. If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO O
r Not IsNumeric(dato.Trim) Then 113. filtro = String.Empty 114. End If 115. 116. If filtro <> String.Empty Then 117. filtro = "[" & Columna & "]" & filtro 118. End If 119. 120. BindingSource.Filter = filtro 121. 122. DataGridView.DataSource = BindingSource.DataSou
rce
123. Return BindingSource.Count 124. 125. Catch ex As Exception 126. MsgBox(ex.Message.ToString, MsgBoxStyle.Critica
l) 127. End Try 128. 129. Return 0 130. 131. End Function 132. 133. Private Sub txt_Filtro_TextChanged( _ 134. ByVal sender As System.Object, _ 135. ByVal e As System.EventArgs) Handles TextBox1.TextC
hanged 136. 137. filtrar() 138. 139. End Sub 140. 141. Private Sub Combo1_SelectedIndexChanged( _ 142. ByVal sender As System.Object, _ 143. ByVal e As System.EventArgs) Handles ComboBox1.Sele
ctedIndexChanged 144. filtrar() 145. End Sub 146. End Class
Nota: si se quiere filtrar por varios campos, se debe indicar al filter la condición por ejemplo de la siguiente manera.
BindingSource .Filter = "[nombre Producto] = 'Nombre' And [Precio] <= 500"
Alternat colunas con diferentes colores
1. Option Explicit On 2. Option Strict On 3.
Option Explicit OnOption Strict On
Imports System.DataImports System.Data.SqlClient
Public Class Form1 Enum e_FILTER_OPTION SIN_FILTRO = 0 NUMERICO_MENOR = 1
4. Public Class Form1 5. 6. Private Sub Form1_Load( _ 7. ByVal sender As System.Object, _ 8. ByVal e As System.EventArgs) Handles MyBase.Load 9. 10. 11. CheckBox1.Text = "Alternar color de fila" 12. 13. 14. ' Agregar 3 headers 15. With DataGridView1 16. 17. .Columns.Add("Id Factura", "Id Factura") 18. .Columns.Add("Fecha", "Fecha") 19. .Columns.Add("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 = Dat
e.Now.AddDays(Fila).ToShortDateString 28. .Item(2, Fila).Value = Date.Now.AddDays(Fila + 1
0).ToShortDateString 29. Next 30. 31. ' Establecer el RowsDefaultCellStyle - color de fond
o de las celdas 32. .RowsDefaultCellStyle.BackColor = Color.White 33. 34. ' alineación para la columna 1 35. .Columns(0).DefaultCellStyle.Alignment = DataGridVie
wContentAlignment.MiddleCenter 36. 37. End With 38. End Sub 39. 40. Private Sub CheckBox1_CheckedChanged( _ 41. ByVal sender As System.Object, _ 42. ByVal e As System.EventArgs) Handles CheckBox1.CheckedCh
anged 43. With DataGridView1 44. 45. ' alternar colores 46. If CheckBox1.Checked Then 47. 48. .RowsDefaultCellStyle.BackColor = Color.White 49. 50. .AlternatingRowsDefaultCellStyle.BackColor = Col
or.AliceBlue 51. 52. 53. Else ' Sin alternar 54. .AlternatingRowsDefaultCellStyle.BackColor = .Ro
wsDefaultCellStyle.BackColor 55. End If 56. End With 57. 58. End Sub 59. End Class
Crear un nuevo proyecto, añadir un windows Form, un control DataGridView llamado DataGridview1
Código fuente
Texto plano Copiar código fuente Imprimir
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 System.EventArgs) Handles MyBase.Load 9. 10. ' llenar la cuadricula con valores 11. With DataGridView1 12. 13. .Columns.Clear() 14. ' agregar cabeceras 15. .Columns.Add("Productos", "Productos") 16. .Columns.Add("stock", "stock Actual") 17. .Columns.Add("Fecha", "Fecha") 18. .Columns.Add("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. .Rows.Add("Producto n° " & i, _ 26. random_stock.Next(25, 500), _ 27. Dat
e.Now.AddDays(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. Handles DataGridView1.EditingControlShowing 41. 42. ' referencia a la celda 43. Dim validar As TextBox = CType(e.Control, TextBox) 44. 45. ' agregar el controlador de eventos para el KeyPress 46. AddHandler validar.KeyPress, AddressOf validar_Keypress 47. 48. End Sub 49. 50. ' evento Keypress 51. ' ''''''''''''''''''' 52. Private Sub validar_Keypress( _ 53. ByVal sender As Object, _ 54. ByVal e As System.Windows.Forms.KeyPressEventArgs) 55. 56. ' obtener indice de la columna 57. Dim columna As Integer = DataGridView1.CurrentCell.Colum
nIndex 58. 59. ' comprobar si la celda en edición 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 = e.KeyChar 64. 65. ' comprobar si el caracter es un número o el retroce
so 66. If Not Char.IsNumber(caracter) And (caracter = ChrW(
Keys.Back)) = False Then 67. 'Me.Text = e.KeyChar 68. e.KeyChar = Chr(0) 69. End If 70. End If 71. End Sub 72. End Class
Ejemplo para poder aceptar el separador decimal para los números
Texto plano Copiar código fuente Imprimir
Option Explicit OnOption Strict On
Public Class Form1
Private Sub Form1_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load
' llenar la cuadricula con valores
1. Dim columna As Integer = DataGridView1.CurrentCell.ColumnIndex 2. 3. ' verificar columna actual 4. If columna = 1 Or columna = 3 Then 5. Dim caracter As Char = e.KeyChar 6. 7. ' referencia a la celda 8. Dim txt As TextBox = CType(sender, TextBox) 9. 10. ' comprobar si es un número con isNumber, si es el backspace
, si el caracter 11. ' es el separador decimal, y que no contiene ya el separador 12. If (Char.IsNumber(caracter)) Or _ 13. (caracter = ChrW(Keys.Back)) Or _ 14. (caracter = ",") And _ 15. (txt.Text.Contains(",") = False) Then 16. 17. 18. e.Handled = False 19. Else 20. e.Handled = True 21. End If 22. End If
Dim dtbTabla As New System.Data.DataTable
dtbTabla = Me.DS.Tables.Add("persona")
dtbTabla.Columns.Add("nombre")dtbTabla.Columns.Add("apellido")dtbTabla.Columns.Add("documento")dtbTabla.Columns.Add("telefono")
Dim dtrFila As DataRow
dtrFila = dtbTabla.NewRow()dtrFila("nombre") = "Pepito"dtrFila("apellido") = "Perez"dtrFila("documento") = "31548588"dtrFila("telefono") = "24545454"
dtbTabla.Rows.Add(dtrFila)Me.tugrilla.DataSource = DataSet.Tables("persona")
He encontrado una solución que tal vez no sea tan buena porque se invierten varias lineas de código pero resulta útil de todas formas
Agregamos una nueva columna al datagridview
datagridview.rows.add()
Y luego recorremos la grilla por cada celda para insertar el texto en la columna respectiva
datagridview.rows(0).cells(0).value= "texto1" datagridview.rows(0).cells(1).value= "texto2" datagridview.rows(0).cells(2).value= "texto3" datagridview.rows(0).cells(3).value= "texto4" datagridview.rows(0).cells(4).value= "texto5
de Eliminar filaPrivate Sub Columna_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BotonEliminarFila.Click ' Eliminar una linia del DataGrid Me.dataGridView1.Rows.Remove(Me.dataGridView1.CurrentRow)End Sub
Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
If Me.txtNombre.Text <> "" Then
If Me.cbxDeporte.Text <> "" Then
´agregamos la informacion a un row o fila del datagrid
Me.dgvEjemplo.Rows.Add(Me.txtNombre.Text, Me.cbxDeporte.Text, Me.dtpFechaInscripcion.Value.ToShortDateString)
´limpiamos los controles
Me.txtNombre.Text = ""
Me.cbxDeporte.Text = ""
Me.dtpFechaInscripcion.Value = Today.Date
Else
MessageBox.Show("Ingrese un deporte", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Else
MessageBox.Show("Ingrese un nombre", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
Private Sub dgvEjemplo_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvEjemplo.CellContentClick
´se puede hacer referencia al nombre de la columna para saber donde hicieron click o solo con el e.columnindex 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 dgvEjemplo.Columns(e.ColumnIndex).Name = "Eliminar" Then
´eliminar row
dgvEjemplo.Rows.RemoveAt(e.RowIndex)
End If
End Sub
Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
If dgvEjemplo.Rows.Count > 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 dgvEjemplo.Rows.Count - 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 (´" + dgvEjemplo.Rows(i).Cells(0).Value.ToString() + "´,´" + dgvEjemplo.Rows(i).Cells(1).Value.ToString() + "´,´" + dgvEjemplo.Rows(i).Cells(2).Value.ToString() + "´)"
´agregamos la sentencia a la lista
ListSqlStrings.Add(SqlString)
Next
If EjecutarTransaccion(ListSqlStrings) Then
MessageBox.Show("Info. guardada correctamente")
Close()
Else
MessageBox.Show("La Info. no se guardo")
End If
Else
MessageBox.Show("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 = Connection.CreateCommand()
Dim transaction As SqlTransaction
Dim strSentencia As Object
Dim sentencia As String = ""
transaction = Connection.BeginTransaction()
command.Connection = Connection
command.Transaction = transaction
Try
For Each strSentencia In ListaSentencias
sentencia = strSentencia.ToString()
command.CommandText = sentencia.ToString()
command.ExecuteNonQuery()
Next
transaction.Commit()
band = True
Catch ex As Exception
MessageBox.Show(ex.Message)
Try
transaction.Rollback()
Catch ex2 As Exception
MessageBox.Show(ex2.Message)
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 fácilmente efectuando una simple consulta a la propiedad CurrentCel l del control DataGridView:
' Referenciamos la celda actual
'
Dim dgvCell As DataGridViewCell = Me.DataGridView1.CurrentCell
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 también podemos conocer igualmente, el tipo de control de edición 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 Tipos de objetos existentes en las celdas
DataGridViewButtonColumn DataGridViewButtonCell
DataGridViewCheckBoxColumn DataGridViewCheckBoxCell
DataGridViewComboBoxColumn DataGridViewComboBoxCell
DataGridViewImageColumn DataGridViewImageCell
DataGridViewLinkColumn DataGridViewLinkCell
DataGridViewTextBoxColumn 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, automáticamente 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 DataGridViewCheckBoxColumn , la variable objeto dgvCel l referenciará a un objeto DataGridViewCheckBoxCel l , y si la columna es del tipo DataGridViewTextBoxColumn , el tipo de objeto de la celda será DataGridViewTextBoxCel l .
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 tendrán 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 serán del tipo de objeto especializado.
La clase DataGridViewTextBoxCel l hereda directamente de la clase base DataGridViewCell , de la que toma la inmensa mayoría de sus propiedades y métodos.
Si nuestra intención es referenciar el objeto DataGridViewTextBoxCel l alojado en la celda actual del control DataGridView, ejecutaríamos algo parecido a lo siguiente:
' Referenciamos el control DataGridViewTextBoxCell actual
'
Dim textBoxCell As DataGridViewTextBoxCell = _
TryCast(Me.DataGridView1.CurrentCell, DataGridViewTextBoxCell)
La importancia de esta clase radica en que la celda actualmente seleccionada, aloja a su vez un control de la clase DataGridViewTextBoxEdit ingControl , que es el control que nos permite editar el valor de la celda, siempre y cuando el valor de la propiedad ReadOnly del control DataGridViewTextBoxCel l sea False .
El control DataGridViewTextBoxEditingControl
Por fin hemos llegado al objeto más recóndito de la celda; al objeto DataGridViewTextBoxEdit ingControl alojado en el objeto DataGridViewTextBoxCel l existente a su vez en el objeto DataGridViewCell , representado éste por la celda actual del control DataGridView.
Desde luego, no me extraña que con tantos nombres parecidos, y de gran longitud, más de uno se haga un pequeño lío. Pero cuando se hayan peleado un par de veces con las celdas del control DataGridView, les aseguro que verán las cosas de otra manera.
Como bien nos dá a entender el nombre del control DataGridViewTextBoxEdit ingControl , éste hereda directamente del clásico control de edición de Visual Basic, el control TextBox, por tanto, implementa todas las propiedades, métodos y eventos de éste último control, permitiéndonos editar el contenido de la celda.
Cuando una celda cualquiera del control DataGridView pasa a modo de edición, se desencadena el evento Edit ingControlShowing , donde el segundo parámetro de su firma es un objeto de la clase DataGridViewEdit ingControlShowingEventArgs (otro nombre más largo aún para añadir a la lista). Esta clase dispone únicamente de dos propiedades públicas: Cel lStyle (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 escóndido control DataGridViewTextBoxEdit ingControl , tal y como se muestra en el siguiente ejemplo:
Private Sub DataGridView1_EditingControlShowing( _
ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs)
_
Handles
DataGridView1.EditingControlShowing
' Referenciamos el control TextBox subyacente en la celda actual.
'
Dim cellTextBox As DataGridViewTextBoxEditingControl
cellTextBox = TryCast(e.Control,
DataGridViewTextBoxEditingControl)
' Obtenemos el valor actual de la celda.
'
MessageBox.Show(cellTextBox.Text)
' Obtenemos el estilo de la celda actual
'
Dim style As DataGridViewCellStyle = e.CellStyle
' Mientras se edita la celda, aumentaremos la fuente
' y rellenaremos el color de fondo de la celda actual.
'
With style
.Font = New Font(style.Font.FontFamily, 10, FontStyle.Bold)
.BackColor = Color.Beige
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 tamaño 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 efectúan en el mismo, si en definitiva se trata de un simple control TextBox? La solución 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 cel lTextBox 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 instrucción AddHandler , pero cada vez que se edite una celda, se estará instalado un controlador, y si se editan 20.000 celdas, se instalarán 20.000 controladores, que desencadenarán 20.000 eventos, que en el caso de estar instalados para los tres eventos de teclado, producirán 60.000 eventos de teclado. Para evitar que se instale un controlador cada vez que se edita una celda, habría que eliminar el controlador con la instrucción RemoveHandler , por ejemplo, en el evento Cel lEndEdit del control DataGridView, que se produce cuando finalice la edición de la celda.
Pero, ¡claro! Esto último tiene un gran inconveniente, porque si eliminamos el controlador de evento en otro procedimiento distinto (Cel lEndEdit ) a aquel donde se ha instalado (Edit ingControlShowing ), necesitaremos una variable objeto con un ámbito superior al local para poder eliminar el controlador de evento. La solución 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 DataGridViewTextBoxEdit ingControl de la celda que actualmente se encuentre en modo de edición, y declararemos la variable objeto con la palabra clave WithEvents , para no tener que añadir y eliminar manualmente los controladores para los tres eventos de teclado, tal y como muestro a continuación:
Private WithEvents cellTextBox As DataGridViewTextBoxEditingControl
Private Sub cellTextBox_KeyDown( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles
cellTextBox.KeyDown
End Sub
Private Sub cellTextBox_KeyPress( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles
cellTextBox.KeyPress
End Sub
Private Sub cellTextBox_KeyUp( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles
cellTextBox.KeyUp
End Sub
Private Sub DataGridView1_EditingControlShowing( _
ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs)
_
Handles
DataGridView1.EditingControlShowing
' Este evento se producirá cuando la celda pasa
' a modo de edición.
' Referenciamos el control DataGridViewTextBoxEditingControl
actual.
'
cellTextBox = TryCast(e.Control,
DataGridViewTextBoxEditingControl)
' Obtenemos el estilo de la celda actual
'
Dim style As DataGridViewCellStyle = e.CellStyle
' Mientras se edita la celda, aumentaremos la fuente
' y rellenaremos el color de fondo de la celda actual.
'
With style
.Font = New Font(style.Font.FontFamily, 10, FontStyle.Bold)
.BackColor = Color.Beige
End With
End Sub
Cómo 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 edición.
Los eventos correspondientes al control de edición de la celda, unidos a los tres eventos del teclado del propio control DataGridView, en teoría nos debe de dar toda la flexibilidad posible para detectar las teclas que el usuario ha presionado.
A continuación 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 existirán miles de ejemplos mejores que los que encontrará aquí, pero lo que sólo pretendo es mostrarle simplemente una manera más de realizar una operación concreta, que no quiere decir que sea la mejor.
Permitir sólo números, el carácter separador decimal, y el carácter negativo, en las celdas de un control DataGridView.
Si en nuestro control DataGridView tenemos una columna donde nos interesaría que sólo se introdujeran datos numéricos (enteros o decimales), controlaríamos la pulsación de teclas en el evento KeyPress del objeto DataGridViewTextBoxEdit ingControl declarado a nivel del formulario.
Por supuesto que el ejemplo también serviría para permitir los citados caracteres en un simple control TextBox, que como se ha explicado en el artículo, es el control que existe en las celdas de un control DataGridView.
Private Sub cellTextBox_KeyPress( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles
cellTextBox.KeyPress
Dim isDecimal, isMinus, isValidChar As Boolean
Dim separadorDecimal As String = Nothing
Select Case e.KeyChar
Case "."c, ","c
' Obtenemos el carácter separador decimal existente
' actualmente en la configuración regional de Windows.
'
separadorDecimal = _
Threading.Thread.CurrentThread. _
CurrentCulture.NumberFormat.NumberDecimalSeparator
' Hacemos que el carácter tecleado coincida con el
' carácter separador existentente en la configuración
' regional.
'
e.KeyChar = separadorDecimal.Chars(0)
' Es un carácter válido.
'
isDecimal = True
isValidChar = True
Case "-"c
' Es un carácter válido.
'
isMinus = True
isValidChar = True
Case Else
' Sólo se admitirán números y la tecla de retroceso.
'
Dim isDigit As Boolean = Char.IsDigit(e.KeyChar)
Dim isControl As Boolean = Char.IsControl(e.KeyChar)
If ((isDigit) OrElse (isControl)) Then
isValidChar = True
Else
e.Handled = True
Return
End If
End Select
' Referenciamos el control TextBox subyacente.
'
Dim tb As TextBox = TryCast(sender, TextBox)
' Si la conversión ha fallado, abandonamos el procedimiento.
'
If (tb Is Nothing) Then
e.Handled = True
Return
End If
' Si es un carácter válido, y el texto del control
' se encuentra totalmente seleccionado, elimino
' el valor actual del control.
'
If ((isValidChar) And (tb.SelectionLength = tb.TextLength)) Then
tb.Text = String.Empty
End If
If (isMinus) Then
' Admitimos el carácter negativo, siempre y cuando
' sea el primer carácter del texto, y no exista ya
' ningún otro signo negativo.
'
If ((tb.Text.Length <> 0) OrElse (tb.Text.IndexOf("-"c) >= 0))
Then
e.Handled = True
Return
End If
End If
If (isDecimal) Then
' Si en el control hay ya escrito un separador decimal,
' deshechamos insertar otro separador más.
'
If (tb.Text.IndexOf(separadorDecimal) >= 0) Then
e.Handled = True
Return
End If
End If
End Sub
Como bien podrá comprobar, el ejemplo tiene en cuenta el carácter separador decimal existente en la configuración regional del usuario, que en algunos casos será el punto (.), y en otros la coma (,).
Asimismo, también tiene en cuenta si se desea introducir un numéro negativo, que sólo se permitirá si el signo menos (-) es el primer carácter existente en la celda o en el control TextBox.