sumar datos

34
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 + CDbl(Dgv.Item(nombre_Columna.ToL ower, 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

Upload: andres-quispe-yana

Post on 02-Jan-2016

113 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sumar datos

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   

Page 2: Sumar datos

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   

Page 3: Sumar datos

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.   

Page 4: Sumar datos

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) _   

Page 5: Sumar datos

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

Page 6: Sumar datos

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")   

Page 7: Sumar datos

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 & "%'"  

Page 8: Sumar datos

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

Page 9: Sumar datos

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.   

Page 10: Sumar datos

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   

Page 11: Sumar datos

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

Page 12: Sumar datos

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  

Page 13: Sumar datos

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.   

Page 14: Sumar datos

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

Page 15: Sumar datos

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

Page 16: Sumar datos

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

Page 17: Sumar datos

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

Page 18: Sumar datos

´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

Page 19: Sumar datos

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)

Page 20: Sumar datos

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

Page 21: Sumar datos

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

Page 22: Sumar datos

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

Page 23: Sumar datos

    ' 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.

Page 24: Sumar datos

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

Page 25: Sumar datos

    ' 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.

Page 26: Sumar datos

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.

            '

Page 27: Sumar datos

            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

Page 28: Sumar datos

        ' 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.

Page 29: Sumar datos