martes, 30 de marzo de 2010

Eliminar duplicados en un listbox o combobox

Simple función en vb.net que recorre todos los elementos de la lista de un
combo o listbox para poder eliminar los elementos o items duplicados

El ejemplo comienza comparando desde el primer item con todos los demás
empezando desde abajo hacia arriba. Si el elemento es el mismo lo elimina con el
método RemoveAt del ListBox indicando el índice
Colocar en el formulario
  • Un control ListBox llamado Listbox1
  • Un control Button llamado Button1

Código fuente en el form

Dibujar líneas mediante el GDI en vb.net

Proyecto Open source realizado en vb.net , que dibuja líneas en un PictureBox

Este código fuente realizado por Michael Burke, demuestra como dibujar líneas en un control Picture mediante el GDI utilizando la clase Graphics y la clase Pen de .NET
El ejemplo permite cambiar el color de las líneas y el sentido de las mismas , También se realiza una simple animación de las líneas dibujadas con un timer.

Los métodos gráficos usados en este ejemplo :
  • CreateGraphics
  • FillRectangle
  • DrawLine
Ejemplo muy básico que dibuja en el formulario , líneas de color rojo al hacer clic en un button, usando el método DrawLine

Código fuente con un Button1

Crear slider en vb.net

Ejemplo en vb.net para crear un Slider usando controles de imagen



Código fuente ( controles : Pic_Barra, Pic_Slider )
Option Explicit On
Option Strict On

Public Class Form1
'Bandera para el evento MouseUp del picturebox
Dim bFlag As Boolean = False

' Valores máximos y mínimos del slider
Dim iValueMax As Integer
Dim iValueMin As Integer

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

iValueMax = 100
iValueMin = 0
End Sub

Private Sub PictureBox2_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic_slider.MouseDown

Dim Posx As Integer
Dim PosTempx As Integer

bFlag = True

While bFlag = True
'Cursor.Position.X devuelve la posición x del cursor en la pantalla
Posx = System.Windows.Forms.Cursor.Position.X
PosTempx = Posx ' temporal par a la pos x

Posx = Posx - (Me.Left + pic_slider.Width)

If (PosTempx <> Posx) And (Posx >= pic_Barra.Left) And _
(Posx + pic_slider.Width) <= (pic_Barra.Left + pic_Barra.Width) Then

'Cambia el Left
pic_slider.Left = Posx

' value
Dim iValor As Integer
' muestra el Value en el label
iValor = CInt((pic_slider.Left - pic_Barra.Left) * (iValueMax - iValueMin) / _
(pic_Barra.Width - pic_slider.Width)) + iValueMin

lblValue.Text = iValor.ToString

End If
' para no ocupar todos los recursos mientras se desliza el slider
Application.DoEvents()
End While
End Sub

Private Sub PictureBox2_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic_slider.MouseUp


bFlag = False
' crear un tooltiptext
Dim ToolTip As New ToolTip()

With ToolTip
.IsBalloon = True ' tipo ballon
.ToolTipIcon = ToolTipIcon.Info ' icono
.ToolTipTitle = "Ejemplo ..." ' titulo
.InitialDelay = 1 'tiempo en aparecer
' texto
Dim sText As String = "Máximo: " & iValueMax.ToString & vbCrLf & _
"Mínimo: " & iValueMin.ToString & vbCrLf & _
"Valor: " & lblValue.Text.ToString
' Lo establece
.SetToolTip(pic_slider, sText)
End With
End Sub
End Class

Cargar campo en un Combobox

Simple ejemplo en visual basic.net , para cargar un campo de una tabla en un
control ComboBox

En el ejemplo, primero se crea una nueva conexión hacia la base de datos de de sql server., en este caso se llama base_prueba
Paso 2, se crea un SqlCommand pasándole la consulta , por ejemplo : "Select Campo From Tabla"
Paso 3 se llena un DataSet con los datos
Paso 4 se asigna al DataSource del ComboBox el dataset
Paso 5 Se indica a la propiedad DisplayMember del combobox , el nombre del campo a visualizar

Código fuente
Option Explicit On
Option Strict On

' Espacio
Imports System.Data.SqlClient

Public Class Form1
' Cadena de conexión
Private Const cs As String = "Data Source=(local)\SQLEXPRESS;" & _
"Integrated Security=True;" &"Initial Catalog=bd_prueba"

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

'enviar el control ComboBox y la consulta
cargar_Combo(ComboBox1, "Select Apellido From t_clientes")

End Sub

Private Sub cargar_Combo(ByVal ComboBox As ComboBox, _
ByVal sql As String)

' nueva conexión indicando al SqlConnection la cadena de conexión
Dim cn As New SqlConnection(cs)

Try

' Abrir la conexión a Sql
cn.Open()

' Pasar la consulta sql y la conexión al Sql Command
Dim cmd As New SqlCommand(sql, cn)

' Inicializar un nuevo SqlDataAdapter
Dim da As New SqlDataAdapter(cmd)

'Crear y Llenar un Dataset
Dim ds As New DataSet
da.Fill(ds)

' asignar el DataSource al combobox
ComboBox.DataSource = ds.Tables(0)

' Asignar el campo a la propiedad DisplayMember del combo
ComboBox.DisplayMember = ds.Tables(0).Columns(0).Caption.ToString

Catch ex As Exception
MessageBox.Show(ex.Message.ToString,"error", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
Finally
If cn.State = ConnectionState.Open Then
cn.Close()
End If
End Try
End Sub
End Class

lunes, 29 de marzo de 2010

Buscar fila en DataGridView

Buscar un registro o fila en una grilla de tipo DataGridView

Simple código de ejemplo que usa el método Find del componente BindingSource para buscar un registro en un campo específico en una tabla

Controles

  • Un control DataGridView llamado DataGridView1
  • Un control Button llamado Button1 ( botón para buscar )
  • Un control textBox llamado textBox1 ( para ingresar el dato )
  • Indicar el campo por el cual buscar ( Primer parámetro del método Find)
  • Establecer la cadena de conexión a utilizar
Código fuente



Buscar usando el método find de la propiedad DefaultView

Código similar al anterior , pero que usa el método Find de la propiedad Defaultview de un Dataset accediendo a la base de datos mediante OLEDB

( Button1 , dataGridView1 y TextBox1)
Nota: indicar la cadena de conexión, el comando sql en el oledbdataAdapter y también el nombre del campo por el cual buscar, en la propiedad Sort

Ejemplos sobre vectores y Arrays en vb.net

Ordenar array en forma alfabética con el método Sort

Lo siguiente es un simple ejemplo que ordena una matriz o array unidimensional en forma ascendente, y el resultado lo muestra en un mensaje

Colocar un control button

Código fuente

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim arr() As String
Dim nombres As String
ReDim arr(2)

arr(0) = "Sebastián"
arr(1) = "Eduardo"
arr(2) = "Jorge"
Array.Sort(arr) ' esto ordena el array alfabeticamente
For Each nombres In arr
MsgBox(nombres)
Next
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Text = "ordenar"
End Sub
End Class




inicializar un vector con valores en su declaración y recorrer los datos

' vector de tipo String
Dim vector_string As String() = {"valor 1", "valor 2", "valor 3"}

' recorrer el vector y mostrar los valores
For i As Integer = 0 To vector_string.Length - 1
MsgBox(vector_string(i).ToString)
Next

' vector de tipo Date
Dim vFecha As Date() = {CDate("12/12/2001"), CDate("02/11/2007")}

' mostrar los valores
For i As Integer = 0 To vFecha.Length - 1
MsgBox(vFecha(i))
Next


' igual pero recorriendo los valores con un bucle For Each
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
For Each elemento As String In vector_string
MsgBox(elemento)
Next

For Each fecha As Date In vFecha
MsgBox(fecha)
Next


Buscar un elemento en un vector para obtener el índice usando los métodos
IndexOf y LastIndexOf de la clase Array

' vector de tipo String
Dim vector As String() = {"Luciano", "Maria", "Jose"}


Dim ret As Integer = Array.IndexOf(vector, "Jose")
' devuelve 2
MsgBox(ret)

ret = Array.IndexOf(vector, "Carlos")
' devuelve -1
MsgBox(ret)

Dim n As Integer() = {1, 2, 3, 2, 3, 2, 2}

' devuelve el índice la última ocurrencia (LastIndexOf)

' devuelve 4
MsgBox(Array.LastIndexOf(n, 3))

Dim letras As String() = {"a", "b", "c", "d", "e", "a"}
' devuelve el índice 5
MsgBox(Array.LastIndexOf(letras, "a"))

Apagar y prender el monitor

Rutina en vb.net para prender y apagar el monitor usando la función del api
postMessage

Código fuente

Option Explicit On

Public Class Form1
' función PostMessage
Public Declare Function PostMessage Lib "user32.dll" _
Alias "PostMessageA" (ByVal hwnd As IntPtr,ByVal wMsg As Int32, _
ByVal wParam As Int32,ByVal lParam As Int32) As Int32
' Contantes
Private Const WM_SYSCOMMAND = &H112&
Private Const SC_MONITOR_POWER = &HF170&
Private Const MONITOR_ON = -1
Private Const MONITOR_OFF = 2

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

' prende el monitor
'''''''''''''''''''''''
'PostMessage(Me.Handle, WM_SYSCOMMAND, SC_MONITOR_POWER, MONITOR_ON)

' standby
'''''''''''''''''''''''
'PostMessage(Me.Handle, WM_SYSCOMMAND, SC_MONITOR_POWER, MONITOR_OFF)


End Sub
End Class

Alternar color de filas en un dataGridView

Ejemplo para alternar mediante la propiedad backColor del objeto AlternatingRowsDefaultCellStyle , el color de filas en un control Datagridview

Controles

  • Un DataGridview ( DataGridView1 )
  • un CheckBox
Código fuente

Transparencia en Windows Forms

Ejemplo para visual basic.net que hace un efecto Fade in Fade out a un formulario, modificando la propiedad Opacity de los mismos mediante un temporizador

Cuando se carga un formulario se realiza el fade in, y cuando se descarga el Fade Out
Para usarlo en varios formularios, hay que crear una instancia de una simple clase que se encarga de aplicarle el incremento o decremento de la transparencia , en los eventos Shown y FormClosing
Nota. No se requiere colocar un control timer en cada formulario, ya que el timer está creado dentro del módulo de clase
Los únicos valores que hay que indicarle al módulo antes de cargarlo ( en el Load ) son:
  • El formulario
  • El valor máximo de transparencia ( el valor de transparencia puede ser un valor desde 0.0 hasta 1. esto en el evento de carga de cada form )
  • El intervalo en milisegundos.
Código fuente del módulo de clase

Transacciones

Ejemplo simple en vb.net y Ado.Net para crear transacciones

En el siguiente código se utiliza el método beginTransaction del objeto sqlConnection, para indicar que iniciamos una nueva transacción, y con los métodos Commit y RollBack del objeto sqlTransaction, poder confirmar o cancelar la transacción iniciada ,y de esta forma tener la seguridad de que al ejecutar mas de una sentencia sql u operación en la base de datos, si alguna falla , poder cancelar todo

Lo siguiente, si al ejecutar el segundo comando, se produce una excepción, se ejecuta el método RollBack para cancelar y deshacer la operación, si no se produce error, se ejecuta Commit para confirmar las dos operaciones realizadas

Código fuente
Option Explicit On
Option Strict On

Imports System.Data.SqlClient

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Dim cs As String = "server=(local)\SQLEXPRESS;" & _
"integrated security=sspi;" &"database=catalogo"

'Instanciar nuevo SqlTransaction
Dim objTransac As SqlTransaction = Nothing
Dim cn As New SqlConnection(cs)

Try

' abrir una nueva conexión a la bd
cn.Open()

' Establecer e iniciar la nueva transacción con BeginTransaction
objTransac = cn.BeginTransaction

' comando 1
' '''''''''''''''''''''''''''''''''''''''''''''
' Inicializar nuevo SqlCommand
Dim cmdInert As New SqlCommand("Insert Into .... )", cn)

With cmdInert
' Establecer la transacción para el Insert
.Transaction = objTransac
.ExecuteNonQuery() ' ejecutar
End With

' comando 2
' '''''''''''''''''''''''''''''''''''''''''''''
Dim cmdUpdate As New SqlCommand("Update .... ", cn)

With cmdUpdate
' establecer la transacción para el comando Update
.Transaction = objTransac
.ExecuteNonQuery() ' ejecutar
End With

' Confirmar la transacción a la base de datos con el método Commit
objTransac.Commit()

' errores
Catch ex As Exception
' cancelar la trnsacción en caso de error en el
'segundo comando con el método Rollback
If Not objTransac Is Nothing Then
objTransac.Rollback() 'deshacer
End If

MsgBox(ex.Message.ToString)
Finally
' cerrar la conexión
If Not cn Is Nothing Then
If cn.State = ConnectionState.Open Then
cn.Close()
End If
End If
End Try
End Sub
End Class

Sumar columna en un DatagridView

Sencillo ejemplo en vb.net para sumar una columna determinada en un control DataGridview
Para el ejemplo colocar en un formulario dos controles Button, un control Label y un Datagridview

Código fuente
Option Explicit On
Option Strict On

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "Sumar columnas en DataGridview"
Button1.Text = "Sumar"
Button2.Text = "Cargar valores"
End Sub

' función que retorna el total
Private Function Sumar(ByVal nombre_Columna As String, _
ByVal Dgv As DataGridView) As Double

Dim total As Double = 0

' recorrer las filas y obtener los items de la columna indicada en "nombre_Columna"
Try
For i As Integer = 0 To Dgv.RowCount - 1
total = total + CDbl(Dgv.Item(nombre_Columna.ToLower, i).Value)
Next

Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try

' retornar el valor
Return total

End Function

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' muostrar el total de la suma en el control Label para la columna llamada Costo
Label1.Text = "Total :" & Format(Sumar("costo", DataGridView1), "c").ToString
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

Randomize()

With DataGridView1
' Agregar dos columnas
.Columns.Clear()
.Columns.Add("Id", "Id Producto")
.Columns.Add("Costo", "Costo")
' agregar 10 filas
.RowCount = 10

' añadir un valor para el campo ID
For Filas As Integer = 0 To .RowCount - 1
.Item(0, Filas).Value = Filas
Next

' añadir un valor aleatorio para el campo Costo
For Filas As Integer = 0 To .RowCount - 1
.Item(1, Filas).Value = Format(CInt(Rnd() * 2500), "c")
Next
End With
End Sub
End Class

StopWatch

Simple ejemplo para medir un intervalo de tiempo para un proceso, usando el objeto StopWatch de .net
Controles :
  • Colocar un control ListBox
  • un Button
Código fuente en el formulario principal

miércoles, 24 de marzo de 2010

Realizar cálculos con el método Compute en .NET

Simple ejemplo en vb.net 2005 , del método Compute para ejecutar cálculos en un DataSet o un objeto DataTable

El ejemplo es un formulario que carga una tabla que tiene cuatro campos :
Campo ID, campo Producto, Campo Precio, y Campo Fecha
Los datos se cargan en una grilla, y al pesionar un botón , se utiliza el método Compute para calcular el valor máximo usando la función MAX, el Valor mínimo con MIN, Contar registros estableciendo un criterio o filtro con COUNT , y sumar registros con la función SUM

Código fuente con los siguientes controles :

  • Un control Button
  • un DataGridView
  • Un textBox

Portapapeles - Ejemplos varios

1 - Saber si el portapapeles contiene una imagen con la función ContainsImage

Option Explicit On

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

If My.Computer.Clipboard.ContainsImage() = True Then
MsgBox("Contiene imagen")
Else
MsgBox("No Contiene imagen")
End If
End Sub
End Class

2 - Establecer y obtener una imagen - Función GetImage

Option Explicit On
Imports System.Windows.Forms.SendKeys
Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

With My.Computer.Clipboard

' envía la pulsación de la tecla print screen
SendKeys.Send("{PRTSC}")

' recupera la imagen
Me.BackgroundImage = .GetImage()
End With
End Sub
End Class

3 - Saber si hay texto almacenado - ContainsText

Option Explicit On

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

If My.Computer.Clipboard.ContainsText() = True Then
MsgBox("Hay texto")
Else
MsgBox("No hay texto")
End If
End Sub
End Class

4 - Saber si hay archivos - ContainsFileDropList

Option Explicit On

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

If My.Computer.Clipboard.ContainsFileDropList() = True Then
MsgBox("Hay archivos")
Else
MsgBox("No hay archivos")
End If
End Sub
End Class

5 - Obtener los archivos - GetFileDropList

Option Explicit On
Imports System.Collections.Specialized
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles MyBase.Load

Dim lista As StringCollection
Dim sArchivos As String = ""

' verifica si hay archivos
If Clipboard.ContainsFileDropList Then
'obtiene
lista = Clipboard.GetFileDropList

ListBox1.Items.Clear()
' los agrega al listbox
For Each sArchivos In lista
ListBox1.Items.Add(sArchivos).ToString()
Next
End If
End Sub
End Class

6 - Colocar o establecer archivos - SetFileDropList

Option Explicit On
Imports System.Collections.Specialized
Imports System.IO.File
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)Handles MyBase.Load

Dim sFile1 As String = "c:\archivo1.txt"
Dim sFile2 As String = "c:\archivo2.txt"

Dim lista As New StringCollection

Try
' verifica si existen
If Exists(sFile1) And Exists(sFile2) Then
' Los agrega a la lista
lista.Add(sFile1)
lista.Add(sFile2)
' los establece
Clipboard.SetFileDropList(lista)
Else
MsgBox("La ruta de los archivos no es válida",MsgBoxStyle.Critical)
End If

Catch mensaje As Exception
MsgBox(mensaje.Message)
End Try

End Sub
End Class

7 - Eliminar todo el contenido - Función Clear

Option Explicit On

Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

My.Computer.Clipboard.Clear()

End Sub
End Class

8 - Leer y guardar texto plano - setText y getText

Option Explicit On

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

My.Computer.Clipboard.SetText("un texto", TextDataFormat.Text)

MsgBox(My.Computer.Clipboard.GetText())

End Sub
End Class

9 - guardar un sonido - SetAudio

Option Explicit On

Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)Handles MyBase.Load
Dim Musica As Byte()
Musica = My.Computer.FileSystem.ReadAllBytes("cool.wav")
My.Computer.Clipboard.SetAudio(Musica)

End Sub
End Class

Oledb - crear base de datos mediante programación

Simple ejemplo en vb.net , que crea una base de datos sql server 2005 usando OLEDB

Controles
  • Un DatagridView
  • Un Button
  • 3 textbox
Código fuente

Obtener la temperatura del disco duro

Ejemplo en vb.net enviado por Sebastián Perdomo, para obtener mediane WMI la temperatura del disco

Nota: se debe añadir la referencia a System.Management desde el menú referencias


Código fuente con un control button en el formulario
Option Explicit On

Imports System
Imports System.Management
Imports System.Windows.Forms

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Button1.Text = "Averiguar la temperatura"

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click


Me.Cursor = Cursors.WaitCursor
Try

Dim Buscar As New ManagementObjectSearcher("root\WMI", _
"SELECT * FROM MSStorageDriver_ATAPISmartData")

For Each queryObj As ManagementObject In Buscar.Get()
Dim arrVendorSpecific As Byte() = queryObj("VendorSpecific")
MsgBox("La Temperatura es: " & arrVendorSpecific(115).ToString & " Grados")
Next

Catch err As ManagementException
MessageBox.Show("Error " & err.Message)
End Try

Me.Cursor = Cursors.Default

End Sub
End Class

martes, 23 de marzo de 2010

Obtener esquema de una tabla de Sql Server

Ejemplo para poder obtener el esquema de una tabla de una base de datos Sql
server

Este Código fuente de ejemplo es de la MSDN y muestra una forma para poder obtener el esquema de una tabla de sql server, utilizando el método GetSchemaTable del objeto SqlDataReader para sql native client y también con OleDbDataReader para Oledb

El mismo ejemplo para vb.net para listar los nombres de columnas y las propiedades para cada campo

Colocar un control ListBox en el formulario, y un control button. Al presionar el botón ,se abre un inputbox para indicar el nombre de la tabla

código fuente
Option Explicit On
Option Strict On

' Espacio de nombres para poder acceder al Sql Native Client
Imports System.Data.SqlClient

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Button1.Text = "Obtener esquema de tabla"

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

Dim Tabla As String = InputBox("Indicar Nombre de la tabla", "Esquema")

If Tabla <> String.Empty Then
' le pasa el nombre de la tabla , y obtiene los datos
'para mostrarlos en el ListBox
With ListBox1
.Items.Clear()
.DataSource = Obtener_Esquema_Tabla(Tabla.ToString)
End With

End If

End Sub

Private Function Obtener_Esquema_Tabla(ByVal Name_tabla As String) As ArrayList

Try

'Crear nueva conexión
Using cn As New SqlConnection()

'Asignar la Cadena de conexión para la base SQL Server.
cn.ConnectionString = "Data Source=(local)\SQLEXPRESS;" & _
"Integrated Security=True;" &"Initial Catalog=bd"

' abrir la conexión
cn.Open()

' Nuevo comando
Dim comando As New SqlCommand()

' Asignar la conexión al comand y la consulta sql
comando.Connection = cn
comando.CommandText = "SELECT * FROM " & "[" & Name_tabla & "]"

' Inicializar y ejecutar el DataReader
Using SqlDataReader As SqlDataReader = comando.ExecuteReader()

'Recuperar el esquema de columna en un DataTable.

Dim esquema As DataTable = SqlDataReader.GetSchemaTable()

Dim arrtemp As New ArrayList

'Recorrer los campos de la tabla
For Each campo As DataRow In esquema.Rows

' Agregar el nombre de la columna

arrtemp.Add("Columna: " & campo(0).ToString())
arrtemp.Add("-------------------------------")

'Obtener las propiedades de cada campo
For Each propiedad As DataColumn In esquema.Columns
'Mostrar el nombre y el valor del campo.
arrtemp.Add(" " & propiedad.ColumnName & " = " & _
campo(propiedad).ToString)
Next
arrtemp.Add("")
Next
' retorna la colección con los datos
Return arrtemp
End Using
End Using

' errores
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try
Return Nothing
End Function
End Class

Red - My Computer Network - métodos

(Como descargar y subir archivos, hacer ping y chequear si hay conexión a intenet en vb.net)

Método DownloadFile

Formulario que usa el método DownloadFile del objeto My.Computer.Network para descargar un archivo desde una url indicada
Form

Controles
  • Un control Button
  • Un control textbox llamado txt_Url
  • Un control textbox llamado txt_path_destino

Código fuente en un form


Algunos otros parámetros de My.Computer.Network.DownloadFile
  • ShowUI : Para ver el cuadro de diálogo de descarga , por defecto está en false y no se visualiza
  • overwrite : si está en True, el archivo se sobreescribe en caso de que exista
  • ConnectionTimeout : indica el tiempo en milisegundos, en que se aboratará la operación de descarga en caso de no poder acceder al archivo remoto ( por defecto está en 1 segundo )

Método UploadFile

Este ejemplo coloca un archivo en la dirección ftp indicada, mostrando el diálogo de progreso modal de windows


Código fuente en el form con un control button1


My.Computer.Network.IsAvailable - saber si hay conexión a internet

Código fuente en un formulario



My.Computer.Network.Pin - Hacer ping a una web
Colocar un control Button

My Computer Info

para obtener los siguientes datos en vb.net 2005 :
Información de la memoria del sistema ( AvailablePhysicalMemory, TotalPhysicalMemory, AvailableVirtualMemory, TotalVirtualMemory )

El nombre del sitema operativo y la versión ( OSFullName, OSPlatform y OSVersion )


Colocar un control Listview en el formulario
Option Explicit On

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles MyBase.Load


Try
' agrega dos encabezados
With ListView1
.Clear()
.Columns.Add(" Información ", 350, HorizontalAlignment.Left)
.Columns.Add(" Valor ", 200, HorizontalAlignment.Left)
.View = View.Details
End With
' agrega los items
With My.Computer.Info
' Referencia al item
Dim ObjItem As ListViewItem

' ram físca libre
'''''''''''''''''''''''''''''''''''''''
ObjItem = New ListViewItem("Memoria Física Disponible ")
ObjItem.SubItems.Add(((.AvailablePhysicalMemory) / 1048576) & " MB")
ListView1.Items.Add(ObjItem)

' Ram fisica total
'''''''''''''''''''''''''''''''''''''''
ObjItem = New ListViewItem("Memoria física total ")
ObjItem.SubItems.Add(((.TotalPhysicalMemory) / 1048576) & " MB")
ListView1.Items.Add(ObjItem)

' Ram Virtual libre
'''''''''''''''''''''''''''''''''''''''
ObjItem = New ListViewItem("Memoria Virtual libre")
ObjItem.SubItems.Add(((.AvailableVirtualMemory) / 1048576) & " MB")
ListView1.Items.Add(ObjItem)

' memoria virtual total
'''''''''''''''''''''''''''''''''''''''
ObjItem = New ListViewItem("Memoria virtual total")
ObjItem.SubItems.Add(((.TotalVirtualMemory) / 1048576) & " MB")
ListView1.Items.Add(ObjItem)

' Nombre del sistema operativo y la versión
''''''''''''''''''''''''''''''''''''''''''''''
ObjItem = New ListViewItem("Sistema operativo - plataforma - versión")
ObjItem.SubItems.Add(.OSFullName & "-" & .OSPlatform & "-" & .OSVersion).ToString()

ListView1.Items.Add(ObjItem)

' autoajusta los headers
ListView1.Columns(0).AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent)
ListView1.Columns(1).AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent)
ObjItem = Nothing
End With
' error
Catch omsg As Exception
MsgBox(omsg.Message, MsgBoxStyle.Critical)
End Try
End Sub
End Class

Ejemplo simple de Formularios Mdi en vb.net

Simple código fuente de muestra en visual basic.net que usa un formulario MDI para abrir y crear archivos de texto
El mismo consta de un form Mdi principal que tiene la opción para crear un nuevo formulario Mdi Child, creando una nueva instancia ( en este caso de formulario frmDoc) .
Este form tiene un Richtextbox donde se puede cargar o crear un archivo de texto. Para leer el documento se usa el método Loadfile y para guardarlo con saveFile

Para crear la nueva instancia del Child Form, se asigna a la propiedad MdiParent del child form al MDI .. en el momento de crearlo.
Para hacer referencia al frm Child activo, (ya que puede haber varios abiertos al mismo tiempo ), hay una variable pública de tipo form ( el from frmDoc ) llamado FrmActivo, que se establece en el evento Activated



Código fuente del MDI
Option Explicit On
Option Strict On

Imports System.Windows.Forms
Imports System.IO

Public Class MDIParent1
' cantidad de Mdi children
Private Child_Count As Integer = 0

Private Sub Crear_Nuevo_Formulario(ByVal sender As Object, _
ByVal e As EventArgs)Handles NewToolStripMenuItem.Click, _
NewToolStripButton.Click,NewWindowToolStripMenuItem.Click
' Crea una nueva instancia de FrmDoc
Crear_Mdi_Child()

End Sub

' crea un nuevo MdiChild
Sub Crear_Mdi_Child(Optional ByVal Ruta As String = "")

' Nueva instancia del formulario secundario ( FrmDoc )
Dim Child_form As New FrmDoc

' Lo asigna a este formulario MDI
Child_form.MdiParent = Me

' Variable con la cantidad de documentos que se crearon
Child_Count += 1

' nuevo doc
If Ruta = "" Then
Child_form.Text = "Nuevo documento " & Child_Count
Else
Child_form.Text = Ruta ' Ruta en el title bar
End If

Child_form.Show() ' lo muestra
End Sub

Private Sub OpenFile(ByVal sender As Object, _
ByVal e As EventArgs)Handles OpenToolStripMenuItem.Click, _
OpenToolStripButton.Click

' nuevo objeto OpenFileDialog
Dim OpenFileDialog As New OpenFileDialog

With OpenFileDialog
' filtro - archivos txt
.Filter = "Archivos de texto (*.txt)|*.txt|Todos los archivos (*.*)|*.*"
'.. abre el dlg
If (OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
'Asigna el path
Dim ruta_archivo As String = OpenFileDialog.FileName

Try
If frmActivo Is Nothing Then
' Si no hay un mdi Child activo, crea uno nuevo y carga el fichero
Crear_Mdi_Child(OpenFileDialog.FileName)
End If
With frmActivo
' carga el documento de texto en el RichTextbox del frm activo
.rtb.LoadFile(ruta_archivo, RichTextBoxStreamType.PlainText)
.Text = ruta_archivo ' path en el title bar
End With
' error
Catch oe As Exception
MsgBox(oe.Message.ToString, MsgBoxStyle.Critical)
End Try
End If
End With
End Sub

' Guardar documento como ...
Private Sub SaveAsToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles SaveAsToolStripMenuItem.Click

If Not frmActivo Is Nothing Then
frmActivo.Guardar_como()
Else
MsgBox("No hay documentos para guardar", MsgBoxStyle.Exclamation)
End If
End Sub

' Finalizar la aplicación
Private Sub ExitToolsStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles ExitToolStripMenuItem.Click
Global.System.Windows.Forms.Application.Exit()
End Sub

Private Sub CutToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles CutToolStripMenuItem.Click
MsgBox("Falta código")
End Sub

Private Sub CopyToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles CopyToolStripMenuItem.Click
MsgBox("Falta código")
End Sub

Private Sub PasteToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles PasteToolStripMenuItem.Click
MsgBox("Falta código")
End Sub

' forms en cascada
Private Sub CascadeToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles CascadeToolStripMenuItem.Click

Me.LayoutMdi(MdiLayout.Cascade)

End Sub

' Organiza los formularios en cascada Vertical
Private Sub TileVerticleToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles TileVerticalToolStripMenuItem.Click
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub

' Organiza los formularios en cascada Horizontal
Private Sub TileHorizontalToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs)Handles TileHorizontalToolStripMenuItem.Click

Me.LayoutMdi(MdiLayout.TileHorizontal)

End Sub

' organiza los formularios
Private Sub ArrangeIconsToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles ArrangeIconsToolStripMenuItem.Click

Me.LayoutMdi(MdiLayout.ArrangeIcons)

End Sub

' Cierra todos los formularios MdiChild abiertos
Private Sub CloseAllToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs)Handles CloseAllToolStripMenuItem.Click, ToolStripMenuItem1.Click

For Each ChildForm As Form In Me.MdiChildren
ChildForm.Close()
Next
End Sub

' guarda el documento
Private Sub MenuToolBarGuardar(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles SaveToolStripButton.Click,SaveToolStripMenuItem.Click
If Not frmActivo Is Nothing Then
frmActivo.Guardar()
Else
MsgBox("No hay documentos para guardar. Crear uno nuevo " & _
"o Abrir un txt existente", MsgBoxStyle.Exclamation)
End If
End Sub

Private Sub SelectAllToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)Handles SelectAllToolStripMenuItem.Click
MsgBox("Falta agregar código", MsgBoxStyle.Information)
End Sub

Private Sub MDIParent1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Me.Text = "Ejemplo simple de MDI en vb.net "

End Sub
End Class
Module Module1
Public frmActivo As FrmDoc
End Module

Código fuente del form Child ( FrmDoc )
Public Class FrmDoc
' flag para cuando se cancela el CommonDialog
Private m_Cancelar As Boolean
' Flag para saber si cambió el documento
Private m_Changed As Boolean

' Activación del Form
Private Sub FrmDoc_Activated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Activated
' referencia al formulario activo cuando se dispara el Activated
frmActivo = Me
End Sub

' descarga del form
Private Sub FrmDoc_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing

Dim ret As Windows.Forms.DialogResult
' si no se cambió ..sale
If m_Changed = False Then
frmActivo = Nothing
Exit Sub
End If
' .. guardar ??
ret = MsgBox("¿ Guardar los cambios al documento: ?" & vbNewLine & Me.Text, _
MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question)

Select Case ret
' Si
Case Windows.Forms.DialogResult.Yes
Guardar()
If m_Cancelar Then
e.Cancel = True ' cancela la descarga
m_Cancelar = False ' Cancelar del OpenFileDialog
End If
' elimina esta instancia

frmActivo = Nothing
' No
Case Windows.Forms.DialogResult.No
frmActivo = Nothing
' Cancelar
Case Windows.Forms.DialogResult.Cancel
e.Cancel = True
End Select
End Sub

' Guardar documento como ...
Function Guardar_como() As Boolean
Dim SaveFiledialog As New SaveFileDialog

With SaveFiledialog
.Filter = "Archivos de texto (*.txt)|*.txt|Todos los archivos (*.*)|*.*"
Try
If .ShowDialog = Windows.Forms.DialogResult.OK Then
'Guardar
frmActivo.rtb.SaveFile(.FileName, RichTextBoxStreamType.PlainText)
m_Changed = False
Else
' Cancelar
m_Cancelar = True
End If
Catch oMen As Exception
MsgBox(oMen.Message, MsgBoxStyle.Critical)
End Try
End With
End Function

' guardar
Function Guardar() As Boolean
Try
' Si el documento existe, lo guarda
If System.IO.File.Exists(frmActivo.Text) = True Then
With frmActivo
.rtb.SaveFile(.Text, RichTextBoxStreamType.PlainText)
m_Changed = False
End With
' si no lo guarda como ...
Else
Guardar_como()
End If
Catch oMen As Exception
MsgBox(oMen.Message, MsgBoxStyle.Critical)
End Try
End Function

Private Sub rtb_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles rtb.KeyPress
' Flag que marca que se cambió el documento
m_Changed = True
End Sub

Private Sub FrmDoc_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
' Por si hubiese direcciones url en el archivo, para no detectarlas
With rtb
rtb.DetectUrls = False
End With
End Sub
End Class

lunes, 22 de marzo de 2010

Leer y grabar datos en un archivo INI

Ejemplo que utiliza las funciones Api GetPrivateProfileString y WritePrivateProfileString para grabar y leer datos en un archivo de configuración ini

La función que lee es GetPrivateProfileString, la función que graba WritePrivateProfileString.
Las dos poeen casi los mismos parámetros: ( La ruta y nombre del archivo Ini, el nombre de La clave a leer o grabar, el Valor que se va a leer o grabar.)
Nota: La función GetPrivateProfileString, tiene un parámetro adicional ( ByVal lpDefault As String ) para los valores por defecto en caso de que no haya ningún dato que leer.
El siguiente ejemplo lo que hace es leer y almacenar en un archivo Ini ( ubicado en el App.Path del programa y llamado Config.ini), ..el ancho, alto, el Top y el Left del formulario.
En el evento FormLoad, se llama a la función de ajuste llamada Leer_Ini (Esta función retorna el valor leido )

Private Function Leer_Ini(Path_INI As String, Key As String, Default As Variant) As String

..en el evento Unload del formulario se llama a la función Grabar_Ini.
Private Function Grabar_Ini(Path_INI As String, Key As
String, Valor As Variant) As String

En el fichero Ini se almacenarán los datos de esta forma:
[MiPrograma]
Left=0
Top=0
Width=12165
Height=5000

Nota: Si el archivo ini no existe, la función api WritePrivateProfileString, lo crea automáticamente, o sea que no generará error de Acceso o ruta de archivo inexistente

Código fuente en el formulario
Option Explicit

Const APPLICATION As String = "MiPrograma"

Dim m_Left As Single
Dim m_Top As Single
Dim m_Width As Single
Dim m_Height As Single

Dim Path_Archivo_Ini As String

'Función api que recupera un valor-dato de un archivo Ini
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String,ByVal lpKeyName As String, _
ByVal lpDefault As String,ByVal lpReturnedString As String, _
ByVal nSize As Long,ByVal lpFileName As String) As Long

'Función api que Escribe un valor - dato en un archivo Ini
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String,ByVal lpKeyName As String, _
ByVal lpString As String,ByVal lpFileName As String) As Long


'Lee un dato _
-----------------------------
'Recibe la ruta del archivo, la clave a leer y _
el valor por defecto en caso de que la Key no exista
Private Function Leer_Ini(Path_INI As String, Key As String, Default As Variant) As String

Dim bufer As String * 256
Dim Len_Value As Long

Len_Value = GetPrivateProfileString(APPLICATION,Key, _
Default,bufer,Len(bufer),Path_INI)

Leer_Ini = Left$(bufer, Len_Value)

End Function

'Escribe un dato en el INI _
-----------------------------
'Recibe la ruta del archivo, La clave a escribir y el valor a añadir en dicha clave

Private Function Grabar_Ini(Path_INI As String, Key As String, Valor As Variant) As String

WritePrivateProfileString APPLICATION,Key,Valor,Path_INI

End Function


Private Sub Form_Load()

'Path del fichero Ini
Path_Archivo_Ini = App.Path & "\config.ini"

' Lee las Key y Les envia el valor por defecto por si no existe
m_Left = Leer_Ini(Path_Archivo_Ini, "Left", 0)
m_Top = Leer_Ini(Path_Archivo_Ini, "Top", 0)
m_Width = Leer_Ini(Path_Archivo_Ini, "Width", 5000)
m_Height = Leer_Ini(Path_Archivo_Ini, "Height", 5000)

'Posiciona el formulario con los valores del archivo Ini
Move m_Left, m_Top, m_Width, m_Height

End Sub

Private Sub Form_Unload(Cancel As Integer)

'Escribe en el archivo Ini

'Posición del Form
Call Grabar_Ini(Path_Archivo_Ini, "Left", Me.Left)
Call Grabar_Ini(Path_Archivo_Ini, "Top", Me.Top)

'Tamaño del formulario
Call Grabar_Ini(Path_Archivo_Ini, "Width", Me.Width)
Call Grabar_Ini(Path_Archivo_Ini, "Height", Me.Height)

End Sub

Cargar rango de Excel en DataGridView

Simple ejemplo para cargar un rango de una hoja de Excel en un
DataGridView

El siguiente es un simple código fuente para poder conectarse a una hoja de un libro, leer un rango de datos y mostrarlos o cargarlos en un control de tipo DataGridView.

Para el ejemplo colocar en un Form los siguientes controles:
  • Un TextBox : llamado txtRange ( Para indicar el rango a cargar en la grilla)
  • Un DataGridView
  • Un control Button
Código fuente
Option Explicit On
Option Strict On

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Button1.Text = "Cargar"
txtRange.Text = "A1:C15"

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' // Pasar valores para Leer el rango
loadRange("c:\book1.xls", "sheet1", txtRange.Text, DataGridView1)

End Sub

' ----------------------------------------------------------------------------------
' // Subrutina para conectar al libro Excel y obtener el rango de datos
' ----------------------------------------------------------------------------------
Private Sub loadRange(ByVal sFileName As String, _
ByVal sSheetName As String,ByVal sRange As String, _
ByVal dv As DataGridView)

Try
' // Comprobar que el archivo Excel existe
If System.IO.File.Exists(sFileName) Then

Dim objDataSet As System.Data.DataSet
Dim objDataAdapter As System.Data.OleDb.OleDbDataAdapter
' // Declarar la Cadena de conexión
Dim sCs As String = "provider=Microsoft.Jet.OLEDB.4.0; " & "data source=" & sFileName & "; Extended Properties=Excel 8.0;"
Dim objOleConnection As System.Data.OleDb.OleDbConnection
objOleConnection = New System.Data.OleDb.OleDbConnection(sCs)

' // Declarar la consulta SQL que indica el libro y el rango de la hoja
Dim sSql As String = "select * from " & "[" & sSheetName & "$" & sRange & "]"
' // Obtener los datos
objDataAdapter = New System.Data.OleDb.OleDbDataAdapter(sSql, objOleConnection)

' // Crear DataSet y llenarlo
objDataSet = New System.Data.DataSet

objDataAdapter.Fill(objDataSet)
' // Cerrar la conexión
objOleConnection.Close()

' // Enlazar DataGrid al Dataset
With dv
.DataSource = objDataSet
.DataMember = objDataSet.Tables(0).TableName
End With
Else
MsgBox("No se ha encontrado el archivo: " & sFileName, MsgBoxStyle.Exclamation)
End If

Exit Sub
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try

End Sub
End Class

Nota. Ejemplo probado con Excel 2000 y Visual basic 2005

Combobox con Imagenes

En este post les mostraré una forma de incluir imágenes al lado de cada elemento de un ComboBox , asi:


Para ello necesitaremos un Windows Form en el que incluiremos un control ComboBox y un Componente ImageList.

En el ImageList cargamos las imágenes que queremos mostrar. En lo posible, el tamaño de estas imágenes debe ser de 16x16.



Ahora necesitamos crear una clase muy simple que nos permita almacenar la etiqueta de los elementos del Combo y el índice de la imagen en el ImageList.

class ComboItem

{
   private int _imageIndex;
   private string _etiqueta;

   public string Etiqueta
   {
       get { return _etiqueta; }
       set { _etiqueta = value; }
   }

   public int ImageIndex
   {
       get { return _imageIndex; }
       set { _imageIndex = value; }
   }

   public ComboItem(string etiqueta, int imageIndex)
   {
       this.Etiqueta = etiqueta;
       this.ImageIndex = imageIndex;
   }

   public override string ToString()
   {
       return Etiqueta;
   }
}

Nada más, ahora lo único que tenemos que hacer es añadir instancias de la clase ComboItem en nuestro comboBox, podemos hacerlo en el evento Load asi:

private void Form1_Load(object sender, EventArgs e)
{
   comboBox1.Items.Add(new ComboItem("Aumentar", 0));
   comboBox1.Items.Add(new ComboItem("Disminuir", 1));
   comboBox1.Items.Add(new ComboItem("---------", -1));
   comboBox1.Items.Add(new ComboItem("Editar", 2));
}
Nótese que el tercer item tiene el índice -1. Usaremos -1 para indicar que un elemento no tiene una imagen asociada.

Ahora si, la verdadera acción:

Primero debemos modificar la propiedad DrawMode del ComboBox, y fijarla en OwnerDrawFixed.

Y finalmente añadimos un manejador para el evento DrawItem del ComboBox, asi:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
   ComboItem item = comboBox1.Items[e.Index] as ComboItem;
   e.DrawBackground();
   if (item.ImageIndex >= 0 && item.ImageIndex < imageList1.Images.Count)
       e.Graphics.DrawImage(imageList1.Images[item.ImageIndex], new PointF(e.Bounds.Left, e.Bounds.Top));
   e.Graphics.DrawString(item.Etiqueta, e.Font, new SolidBrush(e.ForeColor), new PointF(e.Bounds.Left + imageList1.ImageSize.Width + 1, e.Bounds.Top));
}

Eso es todo, nuestro ComboBox ahora muestra su imagen asociada a su izquierda.

En un siguiente post, mostraré cómo se puede crear un control derivado de ComboBox que incluya todo este procedimiento de modo que sea reutilizable.

Filtrar un control DatagridView

Código de ejemplo realizado en vb.net 2005 para filtrar un control BindingSource y luego enlazarlo a un DatagridView

En el ejemplo primero se conecta a un base de datos x de sql server para obtener todos los registros de una tabla en un objeto DataTable.
Luego se enlaza ese objeto DataTable que tiene los datos de la tabla a un componente BindingSource.
Por último , se utiliza la propiedad Filter del BindingSource para filtrar los datos por un determinado campo, y una ves filtrado se enlaza al DatagridView para visualizar los registros

Controles para el ejemplo

  • Añadir un control DataGridView : DataGridView1
  • Un control TextBox para escribir el valor
  • Un Combo para la opción del filtro
  • Indicar la cadena de conexión
  • ( Espacio de nombres usado : System.Data.SqlClient para acceder al cliente de sql )

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

Option Explicit On
Option Strict On

' espacio de nombres para poder acceder al cliente sql
Imports System.Data
Imports System.Data.SqlClient

Public Class Form1

' enumeración para las opciones que se usarán
' para filtrar con el operador Like
Enum e_FILTER_OPTION
SIN_FILTRO = 0
CADENA_QUE_COMIENCE_CON = 1
CADENA_QUE_NO_COMIENCE_CON = 2
CADENA_QUE_CONTENGA = 3
CADENA_QUE_NO_CONTENGA = 4
CADENA_IGUAL = 5
End Enum

' cadena de conexión para SQL EXPRESS en modo local
Private Const cs As String = "Data Source=(local)\SQLEXPRESS;" & _
"Integrated Security=True;" &"Initial Catalog=la_base_de_datos"

'Instanciar el componente BindingSource
Private BindingSource1 As Windows.Forms.BindingSource = New BindingSource

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load


Try
' Inicializar la conexión y abrir
Using cn As SqlConnection = New SqlConnection(cs)
cn.Open()

' Inicializar DataAdapter indicando el sql para recuperar
'los registros de la tabla
Dim da As New SqlDataAdapter("SELECT * FROM la_tabla", cn)
Dim dt As New DataTable ' crear un DataTable

' llenarlo
da.Fill(dt)

' enlazar el DataTable al BindingSource
BindingSource1.DataSource = dt

' agregar las opciones al combobox
With (ComboBox1)

'cargar los items de opciones para filtrar
.Items.Add("No filtrar")
.Items.Add("Que comience con")
.Items.Add("Que No comience con")
.Items.Add("Que contenga")
.Items.Add("Que No contenga")
.Items.Add("Que sea igual")

.DropDownStyle = ComboBoxStyle.DropDownList
.SelectedIndex = 1
End With
End Using
' errores
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub


Private Sub Aplicar_Filtro()

' filtrar por el campo Producto
''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim ret As Integer = Filtrar_DataGridView( _
"Producto",TextBox1.Text.Trim, _
BindingSource1,DataGridView1, _
CType(ComboBox1.SelectedIndex, e_FILTER_OPTION))

If ret = 0 Then
' si no hay registros cambiar el color del txtbox
TextBox1.BackColor = Color.Red
Else
TextBox1.BackColor = Color.White
End If
' visualizar la cantidad de registros
Me.Text = ret & " Registros encontrados"

End Sub

Function Filtrar_DataGridView( _
ByVal Columna As String,ByVal texto As String, _
ByVal BindingSource As BindingSource, _
ByVal DataGridView As DataGridView, _
Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothing) As Integer

' verificar que el DataSource no esté vacio
If BindingSource1.DataSource Is Nothing Then
Return 0
End If

Try

Dim filtro As String = String.Empty

' Seleccionar la opción
Select Case Opcion_Filtro
Case e_FILTER_OPTION.CADENA_QUE_COMIENCE_CON
filtro = "like '" & texto.Trim & "%'"
Case e_FILTER_OPTION.CADENA_QUE_NO_COMIENCE_CON
filtro = "Not like '" & texto.Trim & "%'"
Case e_FILTER_OPTION.CADENA_QUE_NO_CONTENGA
filtro = "Not like '%" & texto.Trim & "%'"
Case e_FILTER_OPTION.CADENA_QUE_CONTENGA
filtro = "like '%" & texto.Trim & "%'"
Case e_FILTER_OPTION.CADENA_IGUAL
filtro = "='" & texto.Trim & "'"
End Select
' Opción para no filtrar
If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO Then
filtro = String.Empty
End If

' armar el sql
If filtro <> String.Empty Then
filtro = "[" & Columna & "]" & filtro
End If

' asigar el criterio a la propiedad Filter del BindingSource
BindingSource.Filter = filtro
' enlzar el datagridview al BindingSource
DataGridView.DataSource = BindingSource.DataSource

' retornar la cantidad de registros encontrados
Return BindingSource.Count

' errores
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try

Return 0

End Function

Private Sub txt_Filtro_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles textbox1.TextChanged

Aplicar_Filtro()

End Sub
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 On
Option Strict On

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1
Enum e_FILTER_OPTION
SIN_FILTRO = 0
NUMERICO_MENOR = 1
NUMERICO_MAYOR = 2
NUMERICO_MENOR_IGUAL = 3
NUMERICO_MAYOR_IGUAL = 4
NUMERICO_IGUAL = 5
NUMERICO_DISTINTO = 6
End Enum

Private Const cs As String = "Data Source=(local)\SQLEXPRESS;" & _
"Integrated Security=True;" &"Initial Catalog=la_base_de_datos"

'Instanciar el componente BindingSource
Private BindingSource1 As Windows.Forms.BindingSource = New BindingSource

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load


Try

Using cn As SqlConnection = New SqlConnection(cs)
cn.Open()

Dim da As New SqlDataAdapter("SELECT * FROM la_tabla", cn)
Dim dt As New DataTable

da.Fill(dt)


BindingSource1.DataSource = dt
With (ComboBox1)
.Items.Add("No filtrar")
.Items.Add("Menor")
.Items.Add("Mayor")
.Items.Add("Menor o igual")
.Items.Add("Mayor o igual")
.Items.Add("Igual")
.Items.Add("Distinto")

.DropDownStyle = ComboBoxStyle.DropDownList
.SelectedIndex = 1
End With
End Using
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub


Private Sub filtrar()

' filtrar por el campo Id de tipo numérico
''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim ret As Integer = Filtrar_DataGridView( _
"Id",TextBox1.Text.Trim,BindingSource1, _
DataGridView1,CType(ComboBox1.SelectedIndex, e_FILTER_OPTION))

If ret = 0 Then
TextBox1.BackColor = Color.Red
Else
TextBox1.BackColor = Color.White
End If
Me.Text = ret & " Registros encontrados"

End Sub

Function Filtrar_DataGridView( _
ByVal Columna As String,ByVal dato As String, _
ByVal BindingSource As BindingSource,ByVal DataGridView As DataGridView, _
Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothing) As Integer
If BindingSource1.DataSource Is Nothing Then
Return 0
End If

Try

Dim filtro As String = String.Empty

' Seleccionar la opción
Select Case Opcion_Filtro
Case e_FILTER_OPTION.NUMERICO_MENOR
filtro = "< " & dato.Trim & ""
Case e_FILTER_OPTION.NUMERICO_MAYOR
filtro = "> " & dato.Trim & ""
Case e_FILTER_OPTION.NUMERICO_MENOR_IGUAL
filtro = "<= " & dato.Trim & ""
Case e_FILTER_OPTION.NUMERICO_MAYOR_IGUAL
filtro = ">= " & dato.Trim & ""
Case e_FILTER_OPTION.NUMERICO_IGUAL
filtro = "= " & dato.Trim & ""
Case e_FILTER_OPTION.NUMERICO_DISTINTO
filtro = "<> " & dato.Trim & ""
End Select

' Sin filtro
If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO Or Not IsNumeric(dato.Trim) Then
filtro = String.Empty
End If

If filtro <> String.Empty Then
filtro = "[" & Columna & "]" & filtro
End If

BindingSource.Filter = filtro

DataGridView.DataSource = BindingSource.DataSource
Return BindingSource.Count

Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try

Return 0

End Function

Private Sub txt_Filtro_TextChanged( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged

filtrar()

End Sub

Private Sub Combo1_SelectedIndexChanged( _
ByVal sender As System.Object,ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
filtrar()
End Sub
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"

Donde los campos de tipo texto deben ir encerrados entre comillas simples.

martes, 16 de marzo de 2010

Exportar un archivo CSV a Excel y Word

Ejemplo que muestra como cargar un archivo CSV en una variable, recorrer los datos, y volcarlo a un nuevo libro de Excel

El ejemplo tiene una sub llamada Exportar_CSV_XLS, a la cual se le debe enviar como primer parámetro el path del archivo Csv, y en el segundo el path con el nombre para guardar el libro de Excel
Para el ejemplo colocar
  • un CommonDialog1
  • un Command1.
Nota: Agregar la referencia a Microsoft Excel para poder usarlo desde visual basic

Código fuente en un formulario
  1. Private Sub Command1_Click()   
  2.   
  3. Dim CVS As String  
  4. Dim XLS As String  
  5.   
  6. With CommonDialog1   
  7.      'Para Abrir el CSV   
  8.      .Filter = "Archivo CSV|*.csv|Todos los archivos|*.*"  
  9.      .DialogTitle = " Seleccionar el archivo CSV"  
  10.      .ShowOpen   
  11.      CVS = .FileName   
  12.      'Para guardar el XLS   
  13.      .Filter = "Archivo Xls|*.xls"  
  14.      .FileName = ""  
  15.      .DialogTitle = " Escriba l nombre del archivo Xls "  
  16.         
  17.      .ShowSave   
  18.      XLS = .FileName   
  19. End With  
  20.   
  21. If CVS = "" Or XLS = "" Then  
  22.    Exit Sub  
  23. Else  
  24.    Call Exportar_CSV_XLS(CVS, XLS)   
  25. End If  
  26. End Sub  
  27.   
  28. Private Sub Exportar_CSV_XLS(path_Cvs As String, path_Xls As String)   
  29.   
  30. On Error GoTo ErrSub   
  31.   
  32. Dim obj_Excel As Object  
  33. Dim Fila As Integer, Columna As Integer  
  34. Dim Contenido As String, Lineas As Variant  
  35. Dim datos As Variant, MC As Integer  
  36.   
  37.   
  38.     'Lee el contenido del CSV y lo almacena en la variable   
  39.     Open path_Cvs For Input As #1   
  40.     Contenido = Input$(LOF(1), #1)   
  41.     Close   
  42.        
  43.     'Nuevo objeto Excel   
  44.     Set obj_Excel = CreateObject("Excel.Application")   
  45.        
  46.     With obj_Excel   
  47.     'Agrega un libro   
  48.     .Workbooks.Add   
  49.        
  50.     ' Obtiene el número de líneas del Csv con la función split   
  51.     Lineas = Split(Contenido, vbCrLf)   
  52.        
  53.     For Fila = 0 To UBound(Lineas)   
  54.            
  55.         'Separa los datos de la linea   
  56.         datos = Split(Lineas(Fila), ",")   
  57.            
  58.         'Recorre los datos de esta fila que corresponden a cada campo   
  59.         For Columna = 0 To UBound(datos)   
  60.             ' Agrega el dato a la celda de la hoja activa   
  61.             .ActiveSheet.Cells(Fila + 1, Columna + 1) = datos(Columna)   
  62.         Next  
  63.         If MC < Columna Then  
  64.            MC = Columna   
  65.         End If  
  66.     Next  
  67.        
  68.     'Selecciona toda la hoja   
  69.     .ActiveSheet.UsedRange.Select  
  70.     'Autoajusta las columnas   
  71.     .Selection.Columns.AutoFit   
  72.        
  73.        
  74.     'Selecciona el encabezado   
  75.     .ActiveSheet.Range(.ActiveSheet.Cells(1, 1), .ActiveSheet.Cells(1, MC)).Select  
  76.            
  77.     End With  
  78.            
  79.     ' Aplica atributos a la fuente a la selección anterior ( los encabezados )   
  80.     With obj_Excel.Selection.Font   
  81.         .Name = "Verdana"  
  82.         .FontStyle = "Bold"  
  83.         .Size = 14   
  84.         .Strikethrough = False  
  85.         .Superscript = False  
  86.         .Subscript = False  
  87.         .OutlineFont = False  
  88.         .Underline = xlUnderlineStyleNone   
  89.     End With  
  90.   
  91.     ' Guarda el documento Xls   
  92.     obj_Excel.ActiveWorkbook.SaveAs _   
  93.         FileName:=path_Xls, _   
  94.         FileFormat:=xlNormal, _   
  95.         password:="", _   
  96.         WriteResPassword:="", _   
  97.         ReadOnlyRecommended:=False, _   
  98.         CreateBackup:=False  
  99.   
  100.     obj_Excel.ActiveWorkbook.Close False  
  101.   
  102.     'Cierra el archivo y elimina la variable   
  103.     obj_Excel.Quit   
  104.     Set obj_Excel = Nothing  
  105.        
  106.     'Fin   
  107.     MsgBox "Archivo Xls guardado ", vbInformation   
  108.        
  109.     Exit Sub  
  110.        
  111. 'Error   
  112. ErrSub:   
  113.     MsgBox Err.Description   
  114.     On Error Resume Next  
  115.     If Not obj_Excel Is Nothing Then  
  116.        obj_Excel.Quit   
  117.       Set obj_Excel = Nothing  
  118.     End If  
  119. End Sub  
  120.   


Convertir un csv a Word

Este ejemplo muestra como utilizar el método ConvertToTable de vba, para convertir y pasar los datos de un archivo csv a una tabla de un nuevo documento de Word.
Para el ejemplo colocar en el formulario un botón, y establecer en la función Convertir, la ruta del fichero csv y la ruta del documento DOC que se crea en el App.Path del programa.
Código fuente
  1. Option Explicit  
  2.   
  3.   
  4. ' --------------------------------------------------------------------------------   
  5. ' \\ -- Botón para convertir el archivo csv   
  6. ' --------------------------------------------------------------------------------   
  7. Private Sub Command1_Click()   
  8.    Call Convertir(App.Path & "\archivo.csv", App.Path & "\archivo_de_word.doc")   
  9. End Sub  
  10.   
  11.   
  12. Public Sub Convertir(sFileNameCSV As String, sFileNameDOC As String)   
  13.        
  14.     ' -- Variables   
  15.     Dim obj_word        As Object  
  16.     Dim obj_Document    As Object  
  17.        
  18.        
  19.     On Error Resume Next  
  20.     ' -- Crear nueva instancia para acceder a Word   
  21.     Set obj_word = GetObject(, "Word.Application")   
  22.     If obj_word Is Nothing Then Set obj_word = CreateObject("Word.Application")   
  23.        
  24.     On Error GoTo word_error   
  25.     If obj_word Is Nothing Then  
  26.         MsgBox "No se pudo acceder a Microsoft Word", vbExclamation   
  27.         Exit Sub  
  28.     End If  
  29.        
  30.     ' -- Opcional - Hacer visible la aplicación   
  31.     obj_word.Visible = True  
  32.        
  33.     ' -- Abrir el archivo CSV con el método Open   
  34.     Set obj_Document = obj_word.Documents.Open(sFileNameCSV)   
  35.        
  36.     ' -- Convertir el documento a una tabla   
  37.     ' -- Nota. el caracter de separación de los campos del archivo csv   
  38.     ' -- es el especificado en la configuración de windows en panel de control   
  39.     ' -- Configuración regional   
  40.     With obj_Document   
  41.         .Range.ConvertToTable Separator:=2, AutoFitBehavior:=0   
  42.     End With  
  43.        
  44.     ' -- Guardar documento de word en el directorio del programa   
  45.     Call obj_Document.SaveAs(sFileNameDOC)   
  46.        
  47. ' -- Eliminar referencias   
  48. CleeanUp:   
  49.     Set obj_Document = Nothing  
  50.     Set obj_word = Nothing  
  51.     Exit Sub  
  52. word_error:   
  53.     MsgBox Err.Description, vbCritical, "Error"  
  54.     Resume CleeanUp   
  55. End Sub  
  56.   
  57. Private Sub Form_Load()   
  58.     Command1.Caption = "Convertir"  
  59. End Sub