Академический Документы
Профессиональный Документы
Культура Документы
Direccin Carretera Mella KM 8 (Mandinga) Urb. Ralma. Calle #5 Urb. Los Mina. Res. Catanga
Registros
La base de datos anterior se podra considerar como una estructura que representa una agenda telefnica donde los datos a almacenar son: Nombre, Apellido, Telfono y Direccin. Todos estos datos son de un mismo tipo y deben ser almacenados en un mismo archivo siguiendo una estructura organizada tal y como se muestra en la tabla anterior. Por ejemplo, en este caso el primer registro Carlos Rodrguez 809-699-5858 Carretera Mella KM 8 (Mandinga) sera la primera lnea del archivo de la base de datos, el segundo registro sera la segunda lnea del archivo, el tercer registro sera la tercera lnea del archivo y as sucesivamente. Si almacenamos estos datos en un archivo deberamos de almacenarlo de la siguiente forma: Carlos;Rodrguez;809-699-5858;Carretera Mella KM 8 (Mandinga) Pablo;Bucarelly;809-585-6325;Urb. Ralma. Calle #5 Nelson;Prez;809-755-2352;Urb. Los Mina. Res. Catanga Se ha utilizado un punto y coma (;) para separar cada uno de los campos de la base de datos. Cuando almacenemos los registros en una base de datos deberemos agregar al final de cada campo un punto y coma (;) que nos va a permitir el final de cada campo de la base de datos. Se puede utilizar otro carcter pero el ms utilizado siempre ha sido el punto y coma (;).
Pgina 1
El primer botn servir para agregar un nuevo contacto o una nueva persona. El segundo botn permitir buscar algn contacto, ya sea por nombre o por el nmero de telfono. El tercer botn ser utilizado para eliminar un contacto de la base de datos. El cuarto botn se utilizar para obtener una lista de todos los contactos que han sido agregado a la base de datos. El quinto botn ser utilizado para salir de la aplicacin.
Establezca los siguientes valores a los controles del formulario anterior para que quede como se muestra en la imagen anterior: Control Form1 Propiedad Caption BorderStyle Height Width StartUpPosition BackColor Valor Agenda 1- Fixed Single 4545 5430 1 CenterOwner
Pgina 2
cmdAgregar
cmdBuscar
cmdBorrar
cmdReporte
cmdSalir
Ahora vamos a agregar un nuevo formulario (Form2) para la primera opcin del men principal. Haga clic en el men Project y luego haga clic en la opcin Agregar Windows Forms. En el cuadro de dialogo que aparece haga clic en el botn Open (abrir).
Pgina 3
El primer botn ser utilizado para guardar los datos del nuevo contacto. El segundo botn ser utilizado para limpiar las cajas de texto y permitir agregar un nuevo contacto. El tercer botn cerrar la ventana de Agregar nuevo contacto.
Establezca los siguientes valores en los controles del nuevo formulario: CONTROL Form2 PROPIEDAD Caption BackColor BorderStyle ShowInTaskBar Height Width StartUpPosition AutoSize Caption BackColor Left Top Font AutoSize Caption BackStyle Font Left Top AutoSize Caption VALOR Agregar nuevo contacto El primer amarillo. 1 Fixed Single False 4005 5445 1 - CenterOwner True INTRODUZCA LOS DATOS DEL NUEVO CONTACTO El primer verde. 120 240 Tamao 8 y Negrita. True Nombre 0 Transparent Tamao 8 y Negrita. 120 720 True Apellido
Label1
Label2
Label3
Pgina 4
Label4
Label5
txtNombre
txtApellido
txtTelefono
txtDireccion
cmdGuardar
cmdNuevo
cmdCancelar
Pgina 5
Active o seleccione el primer formulario (Form1) de la ventana de Proyectos (Project) haciendo doble clic sobre el mismo. Ahora haga clic en el primer botn Agregar un nuevo contacto y escriba en el evento Click la siguiente lnea de cdigo: Form2.Show() La lnea de cdigo anterior permite mostrar el segundo formulario. El mtodo Show permite mostrar un formulario en la pantalla. Active el segundo formulario (Form2) de la ventana de Proyecto (Project) haciendo doble clic sobre el mismo. Ahora vamos a codificar el botn de Guardar: En el evento Click del botn Guardar escriba lo siguiente:
Dim iNumArchivo As Integer iNumArchivo = FreeFile() FileOpen(iNumArchivo, "agenda.dat", OpenMode.Append) Print(iNumArchivo, txtNombre.Text & ";" & txtApellido.Text & ";" & txtTelefono.Text & ";" & txtDireccion.Text) FileClose() txtNombre.Text = "" txtApellido.Text = "" txtTelefono.Text = "" txtDireccion.Text = "" txtNombre.Focus() MsgBox("El nuevo contacto ha sido agregado.")
Explicacin del cdigo anterior: - Segunda lnea: FileOpen(iNumArchivo, agenda.dat, OpenMode.Append) En esta lnea de cdigo la nica novedad es el mtodo Append que permite agregar informacin al final del archivo y si este no existe entonces se crea. No utilizamos el mtodo Output por la razn de que este mtodo crea nuevamente el archivo y elimina los datos que tenia anteriormente para sustituirlo con los nuevos datos. - Tercer lnea: Print(iNumArchivo, Text1.Text & ";" & Text2.Text & ";" & Text3.Text & ";" & Text4.Text) Esta lnea permite escribir en una lnea del archivo el contenido de cada unas de las cajas de texto separado con un punto y coma (;), como habamos explicamos anteriormente. - Ultimas lneas: FileClose()
Pgina 6
Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text1.SetFocus MsgBox ("El nuevo contacto ha sido agregado.") En estas ltimas lneas no hay nada nuevo. Se cierra el archivo, se limpian cada unas de las cajas de texto, se hace que el cursor se posicione en la primera caja de texto y se muestra un mensaje. Corra la aplicacin y, a continuacin, haga clic en el botn Agregar un nuevo contacto. Debe de aparecer el segundo formulario (Form2). Bien agregue un contacto y haga clic en el botn Guardar. Inmediatamente este registro se agrega en la base de datos. Ms adelante veremos como leer estos registros. Detenga la aplicacin. Haga doble clic en el botn Nuevo del segundo formulario (Form2) y escriba lo siguiente: Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text1.Focus() Explicacin del cdigo anterior: Ninguna novedad. Limpia todas las cajas de texto y hace que el cursor se posicione en la primera caja. En el evento Click del botn Cancelar escriba: Close() Explicacin del cdigo anterior: Close() Esta lnea de cdigo permite cerrar el formulario y no la aplicacin completa. Active el primer formulario desde la ventana de Proyectos (Project) haciendo doble clic sobre el mismo. Ahora vamos a crear un nuevo formulario que ser el formulario de la segunda opcin del men principal. En este formulario agregaremos todo lo necesario para buscar un contacto, ya sea por nmero telefnico o por nombre. Agregue un nuevo formulario haciendo clic en el men Project y a continuacin, en Agregar Windows Forms. En el cuadro de dialogo que aparece haga clic en el botn Open. Aparecer un nuevo formulario (Form3).
Pgina 7
En el evento Click del botn de comando Buscar escriba el siguiente bloque de cdigo:
If Len(Trim(txtBusqueda.Text)) = 0 Then MsgBox("Debe escribir algo en la caja de texto.") txtBusqueda.Focus() ElseIf optNombre.Checked = False And optNumero.Checked = False Then MsgBox("Debe seleccionar el tipo de bsqueda.") Else On Error GoTo NOarchivo Dim Linea As String Dim iNumArchivo As Integer Dim Campo1, Campo2, Campo3, Campo4 As String Dim Posicion1, Posicion2, Posicion3 As Integer Dim Encontro As Integer Encontro = 0 iNumArchivo = FreeFile() FileOpen(iNumArchivo, "agenda.dat", OpenMode.Input) 'Open "C:\AGENDA\Agenda.dat" For Input As #1 While Not EOF(iNumArchivo) 'Line Input #1, Linea Linea = LineInput(iNumArchivo) Posicion1 = InStr(1, Linea, ";", vbTextCompare) Posicion2 = InStr(Posicion1 + 1, Linea, ";", vbTextCompare) Posicion3 = InStr(Posicion2 + 1, Linea, ";", vbTextCompare) Campo1 = Mid(Linea, 1, Posicion1 - 1) Campo2 = Mid(Linea, Posicion1 + 1, Posicion2 - 1 - Posicion1) Campo3 = Mid(Linea, Posicion2 + 1, Posicion3 - 1 - Posicion2) Campo4 = Mid(Linea, Posicion3 + 1, Len(Linea)) If UCase(Campo1) = UCase(txtBusqueda.Text) And optNombre.Checked = True Then MsgBox("Nombre: " & Campo1 & " Apellido: " & _ Campo2 & " Telfono: " & Campo3 & " Direccin: " & Campo4) Encontro = 1 End If If Campo3 = txtBusqueda.Text And optNumero.Checked = True Then
Pgina 8
MsgBox("Nombre: " & Campo1 & " Apellido: " & _ Campo2 & " Telfono: " & Campo3 & " Direccin: " & Campo4) Encontro = 1 End If End While If Encontro = 0 Then MsgBox("No se ha encontrado el contacto especificado.") End If FileClose(iNumArchivo) End If Exit Sub NOarchivo: MsgBox("La base de datos no existe.")
Explicacin del bloque de cdigo anterior: - Las primeras tres lneas: If Len(Trim(txBusqueda.Text)) = 0 Then MsgBox ("Debe escribir algo en la caja de texto.") txtBusqueda.Focus() Este bloque de cdigo permite verificar si la caja de texto se deja vaca, en caso de que se deje vaca entonces se muestra un mensaje y el cursor se enva a la caja de texto. La sentencia Len permite obtener la longitud de una cadena de caracteres, en este caso la longitud de la caja de texto. La sentencia Trim permite eliminar los espacios en blanco que posiblemente se escriban al final de la caja de texto. La traduccin del cdigo anterior sera la siguiente: SI LA LONGITUD DE LA CAJA DE TEXTO ES IGUAL A CERO ENTONCES MUESTRA EL MENSAJE (Debe escribir algo en la caja de texto) HAS QUE LA CAJA DE TEXTO RESIVA EL ENFOQUE - Lnea 4, 5 y 6: ElseIf optNombre.Checked = False And optNumero.Checked = False Then MsgBox ("Debe seleccionar el tipo de bsqueda.") Else Este bloque de cdigo permite verificar si se selecciona una de las opciones del tipo de bsqueda. La propiedad Checked permite verificar si el botn de opcin esta seleccionado o no. Cando tiene el valor False indica que el botn no esta seleccionado. La traduccin del bloque anterior es la siguiente:
Pgina 9
Pgina 10
Cada carcter tiene una posicin en la cadena. Estas posiciones que hemos ledo sern de mucha utilidad a la hora de leer los campos de la base de datos. Eso lo veremos a continuacin. El formato de la sentencia InStr es el siguiente: InStr(Valor_Inicial, Cadena_Principal, Cadena_a_Buscar, Tipo_de_busqueda) Donde: Valor_Inicial: Es un nmero de una posicin de algn carcter de la cadena de texto principal. Por ejemplo, si el valor inicial es 1 entonces la bsqueda comienza desde el principio de la cadena, es decir, desde el primer carcter. Cadena_Principal: Representa la cadena de caracteres en donde se realizar la bsqueda.
Pgina 11
Pgina 12
Campo2 = Mid(Linea, 8, 14 1 7) El 8 es por Posicion1 + 1 que es la posicin del primer punto y coma (;). El 14 es por Posicion2 que es la posicin del segundo punto y coma (;). El -1 es para que en la copia no se incluya el primer punto y coma (;). -Posicion1 es la posicin del primer punto y coma que se le resta a la segunda posicin menos uno, esto le dar la cantidad de caracteres del segundo campo. 14 1 7 = 6 que es la longitud del campo Apellido. c) Campo3 = Mid(Linea, Posicion2 + 1, Posicion3 - 1 - Posicion2) Esta lnea lee el campo Telfono. Se aplica lo mismo que al campo anterior pero iniciando desde la posicin2. d) Campo4 = Mid(Linea, Posicion3 + 1, Len(Linea)) Esta lnea lee el campo Direccin. Se aplica lo mismo que el campo anterior pero iniciando desde la posicin3. Len(Linea) es lo nico diferente y se especifica porque no existe una ultima posicin que indique la longitud del ltimo campo. Siempre tendr que utilizar esta sentencia para leer el ltimo campo, pero todo lo dems es igual. - Lnea 25, 26, 27, 28 y 29: If UCase(Campo1) = UCase(Text1.Text) And Option1.Value = True Then MsgBox ("Nombre: " & Campo1 & " Apellido: " & _ Campo2 & " Telfono: " & Campo3 & " Direccin: " & Campo4) Encontro = 1 End If Este bloque de cdigo permite verificar si el contenido del campo nombre es igual al contenido de la caja de texto para luego mostrar el registro completo en una caja de mensaje. La sentencia Ucase permite convertir un texto en mayscula. Esta sentencia se utilizo para que no exista problema de mayscula y minscula, es decir, si el usuario escribe el nombre en mayscula y en la base de datos esta en minscula entonces habr un problema, porque no sera el mismo texto aunque dijera lo mismo, por esa razn se ha convertido el valor del campo y el valor de la caja de texto en mayscula. La traduccin del bloque anterior es la siguiente: SI el campo nombre en mayscula = al contenido de la caja de texto en mayscula Y la primera opcin esta seleccionada (la opcin bsqueda por nombre) Entonces Muestra (El nombre, el apellido, el telfono y la direccin) Asigna el valor uno a la variable Encontr para saber que se encontr el registro Finaliza el SI - Lneas 30, 31, 32, 33 y 34: If Campo3 = Text1.Text And Option2.Value = True Then
Pgina 13
Pgina 14
Ahora vamos a darle funcin a la tercera opcin del men principal (Eliminar contacto): Agregue un nuevo formulario y dibuje el siguiente entorno:
Pgina 15
Pgina 16
If UCase(Campo1) = UCase(txtBusqueda.Text) And optNombre.Checked = True Then registroBorrar = posicionRegistro Respuesta = MsgBox("Desea eliminar el registro " & "'" & _ Campo1 & Chr(32) & Campo2 & "' ?", vbYesNo) If Respuesta = vbYes Then 'SE MODIFICA EL ARREGLO ' --------------------------------------For I = 1 To NumeroLinea If I = registroBorrar Then LineasdelArchivo(I) = "" End If Next I End If Encontro = Encontro + 1 End If If UCase(Campo3) = UCase(txtBusqueda.Text) And optNumero.Checked = True Then Respuesta = MsgBox("Desea eliminar el registro " & "'" & _ Campo1 & Chr(32) & Campo2 & "' ?", vbYesNo) If Respuesta = vbYes Then 'SE MODIFICA EL ARREGLO ' ---------------------------------------For I = 1 To NumeroLinea If I = registroBorrar Then LineasdelArchivo(I) = "" End If Next I End If Encontro = Encontro + 1 End If End While 'Close #1 FileClose(iNum2Archivo) If Encontro = 0 Then MsgBox("No se ha encontrado el contacto especificado.") End If If Encontro > 0 And Respuesta = vbYes Then FileOpen(iNum3Archivo, "TemporalArchivo.dat", OpenMode.Output) ' Open "C:\AGENDA\TemporalArchivo.Dat" For Output As #2 For I = 1 To NumeroLinea
Pgina 17
Explicacin del bloque de cdigo anterior: 1.- Lneas desde la 1 hasta la 14: Es la misma codificacin que se escribi en el botn buscar del formulario Buscar contacto. 2.- Lneas 15, 16, 17, 18, 19 y 20: Dim posicionRegistro As Integer Dim LineasdelArchivo(1000000) As String Dim NumeroLinea As Integer Dim registroBorrar As Integer posicionRegistro = 0 NumeroLinea = 0 En la lnea 15 de declara una variable llamada posicionRegistro de tipo entero. En esta variable se almacenar el registro actual que se esta leyendo de la base de datos, para saber cual es el nmero del registro que se esta leyendo. En la lnea 16 se declara un arreglo llamado LineasdelArchivo de tipo cadena. Este arreglo permitir almacenar un milln de registros de la base de datos en caso de que existan. Este arreglo es muy importante, ya que va a permitir almacenar temporalmente cada registro de la base de datos. En la lnea 17 se declara una variable llamada NumeroLinea de tipo entero. En esta variable se almacenar el total de registros de la base de datos, es decir, el nmero de lneas que tiene la base de datos.
Pgina 18
Este bloque de cdigo permite almacenar en el arreglo cada uno de los registro de la base de datos. Lo nico nuevo es el bloque de cdigo LineasdelArchivo(NumeroLinea) que explicar a continuacin: La variable NumeroLinea se incrementar cada vez que se repite el bucle. Gracias a esto es posible almacenar en posiciones diferentes del arreglo cada registro ledo de la base de datos. Cada vez que se repite el bucle sucede lo siguiente: LineasdelArchivo(1) = LineInput( iNumArchivo) Cuando inicia el bucle LineasdelArchivo(2) = LineInput( iNumArchivo) La segunda repeticin LineasdelArchivo(3) = LineInput( iNumArchivo) La tercera repeticin LineasdelArchivo(4) = LineInput( iNumArchivo) La cuarta repeticin Esto se repite hasta el fin del archivo. - Lneas desde la 30 a la 40:
FileOpen(iNum2Archivo, "agenda.dat", OpenMode.Input) 'Open "C:\AGENDA\Agenda.dat" For Input As #1 While Not EOF(iNum2Archivo) posicionRegistro = posicionRegistro + 1 'Line Input #1, Linea Linea = LineInput(iNum2Archivo) Posicion1 = InStr(1, Linea, ";", vbTextCompare) Posicion2 = InStr(Posicion1 + 1, Linea, ";", vbTextCompare) Posicion3 = InStr(Posicion2 + 1, Linea, ";", vbTextCompare) Campo1 Campo2 Campo3 Campo4 = = = = Mid(Linea, Mid(Linea, Mid(Linea, Mid(Linea, 1, Posicion1 - 1) Posicion1 + 1, Posicion2 - 1 - Posicion1) Posicion2 + 1, Posicion3 - 1 - Posicion2) Posicion3 + 1, Len(Linea))
Esta codificacin se explica en el botn Buscar de la ventana Buscar contacto. Se ha agregado una nueva lnea de cdigo posicionRegistro = posicionRegistro + 1. Esta variable se incrementa cada vez que se lee un registro. En pocas palabras esta variable almacena el nmero del registro que se lee de la base de datos. - Lneas desde la 41 a la 55:
If UCase(Campo1) = UCase(txtBusqueda.Text) And optNombre.Checked = True Then registroBorrar = posicionRegistro Respuesta = MsgBox("Desea eliminar el registro " & "'" & _
Pgina 19
En la primera lnea del bloque anterior se declara una variable donde se almacena la respuesta proporcionada por el usuario, cuando se le hace la pregunta Desea borrar el registro?. Si el usuario hace clic en el botn YES o SI, entonces en la variable se almacena un valor constante que es vbYES. Si hace clic en el botn NO, entonces en la variable se almacena un valor constante que es vbNO. La segunda lnea del cdigo anterior se explic en el botn Buscar. La lnea 38 que es la tercera lnea del cdigo anterior, permite almacenar en la variable RegistroBorrar el nmero del registro que se va a borrar, que es el registro actual ledo de la base de datos. Respuesta = MsgBox("Desea eliminar el registro " & "'" & _ Campo1 & Chr(32) & Campo2 & "' ?", vbYesNo) Lo nuevo en esta lnea de cdigo es la variable Respuesta delante de la sentencia MsgBox. Esta variable permite almacenar la respuesta proporcionada por el usuario. If Respuesta = vbYes Then 'SE MODIFICA EL ARREGLO ' -------------------------------------For I = 1 To NumeroLinea If I = registroBorrar Then LineasdelArchivo(I) = "" End If Next I End If Encontro = Encontro + 1 End If En este bloque se comprueba cual fue la respuesta proporcionada por el usuario, si la respuesta es si, se hace una modificacin en el arreglo. La traduccin del bloque anterior es la siguiente: SI Respuesta = Si Entonces
Pgina 20
Fin SI
- Lneas desde la 56 hasta la 69 If UCase(Campo3) = UCase(Text1.Text) And Option2.Value = True Then Respuesta = MsgBox("Desea eliminar el registro " & "'" & _ Campo1 & Chr(32) & Campo2 & "' ?", vbYesNo) If Respuesta = vbYes Then 'SE MODIFICA EL ARREGLO ' -------------------------------------For I = 1 To NumeroLinea If I = registroBorrar Then LineasdelArchivo(I) = "" End If Next I End If Encontro = Encontro + 1 End If La misma codificacin del bloque de cdigo anterior. La nica diferencia es que se hace cuando se selecciona la opcin bsqueda por telfono en vez de bsqueda por nombre. - Lneas desde la 70 hasta la 74: End While FileClose(iNum2Archivo) If Encontro = 0 Then MsgBox ("No se ha encontrado el contacto especificado.") End If Este bloque de cdigo se entiende claramente. Indica primero el fin del bucle, cierra el archivo y verifica si no se encontr el contacto especificado para luego mostrar un mensaje al usuario. -Lneas desde la 75 hasta la 98:
Pgina 21
La primera lnea del bloque anterior permite verificar si se ha encontrado algn elemento para borrar y verifica tambin si el usuario proporciona la respuesta Si, es decir, si el desea que el registro sea borrado. Es lgico que en la bsqueda se puede encontrar el contacto, pero esto no es suficiente, tambin se requiere saber si el usuario quiere borrar el contacto de la base de datos. Por tal razn se verifica ambas cosas. 'SE CREA UN ARCHIVO TEMPORAL
FileOpen(iNum3Archivo, "TemporalArchivo.dat", OpenMode.Output)
For I = 1 To NumeroLinea - Encontro Print #2, LineasdelArchivo(I) Next I Close #2 Este bloque de cdigo crea un archivo temporal con los datos que contiene el arreglo. Es muy importante crear un archivo temporal con los datos de la base de datos original porque no trabajaramos directamente con la base de datos y se envidaran muchos problemas futuros. El cdigo se entiende claramente: Se abre el archivo para modo de escritura, se inicia un bucle que se repetir hasta el total de lneas del archivo menos el total de registros borrados, se almacena cada uno de los elementos del arreglo y se cierra el archivo. Kill "agenda.dat" Esta lnea de cdigo elimina la base de datos general, pero esto no importa, porque ya tenemos una copia de la base de datos original.
Pgina 22
Esta lnea de cdigo cambia el nombre de la base de datos temporal y le pone el nombre de la base de datos original. Esto se debe de entender claramente. MsgBox (Encontro & " registro eliminados.") txtBusqueda.Text = "" La primera muestra el total de registros eliminados y la segunda limpia la caja de texto donde se escribi el nombre o el telfono del contacto. Las dems lneas las hemos visto anteriormente. En el evento Click del botn Cancelar escriba: Close() En el evento Click del tercer botn del men Principal de nuestra aplicacin escriba: Form3.Show() Corra la aplicacin. Haga clic en el botn Eliminar contacto, introduzca el nombre del contacto que desea eliminar y a continuacin, haga clic en el botn Buscar. Si el contacto no existe agrguelo. Ahora daremos funcin a la cuarta opcin del men principal, al botn Reporte. Agregue un nuevo formulario. Antes de proseguir debemos agregar un nuevo control a la barra de controles. Este control se llama ListView que estudiamos en el captulo anterior. Haga clic derecho sobre la barra de controles y seleccione la opcin Componentes (Components). En el cuadro de dilogo Componente, busque y active el componente Microsoft Windows Common Controls y haga clic en el botn Aceptar. Dibuje un control ListView imagen: en el formulario y dos botones de comando, tal y como se muestra en la siguiente
Pgina 23
Haga un solo clic sobre el control ListView y busque la propiedad View. Establezca el valor 3 lvwReport. Este valor permitir mostrar los registros como un reporte. El bloque de cdigo anterior permite agregar los encabezados al control ListView. Los encabezados sern los campos de la base de datos.
Dim dato As ListViewItem Dim iNumArchivo As Integer On Error GoTo Noarchivo Dim Linea As String Dim campo1, campo2, campo3, campo4 As String Dim Posicion1, Posicion2, Posicion3 As Integer Dim column1 As New System.Windows.Forms.ColumnHeader Dim column2 As New System.Windows.Forms.ColumnHeader Dim column3 As New System.Windows.Forms.ColumnHeader Dim column4 As New System.Windows.Forms.ColumnHeader column1.Text column2.Text column3.Text column4.Text = = = = "Nombre" "Apellido" "Domicilio" "Telfono" 80 80 80 140
= = = =
'siempre es importante asegurarse que no existan 'columnas y para eso es mejor borrarlas antes de 'agregar las nuevas columnas ListView1.Columns.Clear()
Pgina 24
Nada nuevo en el bloque de cdigo anterior. En el evento Click del botn Cerrar escriba: Close() Corra la aplicacin. Haga clic en el botn Reporte. Si hay datos se mostrarn de forma organizada en el control ListView. Detenga la aplicacin y gurdela en la carpeta AGENDA.
Pgina 25