Colaboraciones en el Guille

Creando un Super ComboBox en vb.net - I

 

Fecha: 04/Dic/2005 (03/12/05)
Autor: Beto Javi Castillo Vásquez-Becavas@hotmail.com

Que privilegio....

Colaboraciones en el Guille

¡Hola mundo!, Quiero empezar este articulo diciendo que es para mi un privilegio pertenecer a esta comunidad de locos.net, je je je , no se asusten es así como llamo a todos aquellos que aman la programación y que están dispuesto a aportar sus conocimientos sin finalidad de lucro(con cariño je je je ).Este es el primer articulo que escribo y estoy seguro que les servirá un montón cuando estén desarrollando sus aplicaciones .net. Bueno sin mas preámbulos empecemos a desarrollar juntos este articulo, ok?.

Unas de mis mas grandes inquietudes cuando programaba con vb 6.0 era crear mis propios controles y personalizarlos como se me diera la gana, es cierto que en vb.6.0 se podían crear los famosos .ocx pero eran algo complicados crearlos y sobre todo limitados para la imaginación de cualquier programador, bueno, pero cuando apareció el BUMM de las tecnologías .net la cosa ah cambiado totalmente. Posiblemente existan artículos de lo que vamos a ver, la verdad no lo se, de repente serán similares pero no iguales je je je.

Bien a nuestro control con el que nos vamos a loquear le crearemos:

En la próxima entrega veremos que también podemos crearle sus propios eventos, si si no leíste mal sus propios eventos así como tus cajas de texto tienen sus eventos click, keypress, etc. te imaginas!!!! Bueno por ahora crearemos solo métodos y propiedades (asumo que saben la definición métodos y propiedades).

Seguramente cuando has programado te has encontrado con una situación como por ejemplo de un mantenimiento de trabajadores donde normalmente los trabajadores pertenecen a categorías así que en tu mantenimiento debe tener un combobox donde se elija las categorías respectivas verdad?, bien, cuando hagas el código del botón "GUARDAR" tendrás que hacer una rutina para capturar el código de la categoría que escogiste verdad???,porque lo que se necesita es guardar el código de la categoría y no la descripción (coquito de computación je je je ),bien eso no es complicado pero quita tiempo y hasta se vuelve aburrido verdad!!!, bueno es precisamente aquí donde hace su aparición el SUPER COMBOBOX (como lo he denominado modestamente je je je)que vamos a crear , que nos va a servir para reutilizarlo en cualquier aplicación y que de hecho nos va a facilitar la vida, pero sobre todo a optimizar el tiempo que es el oro negro de los programadores.

Lo primero que tenemos que hacer es crear un proyecto de “BIBLIOTECA DE CONTROLES DE WINDOWS y le ponemos el nombre que mejor nos parezca OK?

Colaboraciones en el Guille

Ahora en el UserControl que aparece le agregamos un combobox con el name de “Cbotodo”y una lista con el name de “lsid” como muestra la figura. ahhh al UserControl le ponen el nombre de ComboTodo ok??

Colaboraciones en el Guille

Bien ahora buscamos la propiedad Modifiers de ambos controles y los colocamos en Public, por defecto estará en Friend ok?,modificamos esta propiedad con la finalidad de poder tener accesibilidad a ellos en los proyectos donde los reutilizaremos, no voy a ondear mucho en el tema, pero estoy seguro que ustedes lo harán para una mejor comprensión de lo que estamos haciendo, buscamos la propiedad visible del listbox y la colocamos en False , reducimos el tamaño del UserControl de tal manera que solo se visualice el combobox nada mas.

 

Colaboraciones en el Guille

ahora buscamos la propiedad Anchors solo del combobox y nos aseguramos que los cuatro lados estén seleccionados esto con la finalidad de que los bordes del combobox se acoplen a los bordes del contenedor(que en este caso es el UserControl)de tal manera que cuando agrandemos el UserCotrol el combobox lo haga con el, ustedes mismos pueden experimentar modificando las propiedad y viendo los resultados cuando agranden el UserControl.ahhhhhh me olvidaba!!!!,tambien la propiedad DropDownStyle del comboBox debe estar en "DropDownList" ok????

Colaboraciones en el Guille

Ahora que ya hemos diseñado como se visualizara nuestro control (obviamente si ustedes quieren le pueden dar color y personalizarlo como mejor les parezca) pasaremos a la parte mas interesante de esto que es la codificación, que es la parte que a mi mas me gusta ok???

Creando la Aplicación

    'declaramos  dos variables una para la conexión y otra para el
    'procedimiento almacenado que vamos a usar
    Private conex As SqlConnection
    Private sp As String
    'creamos dos propiedades que tendra nuestro Super ComboBox
    '--------------------------------------------------------
    'la primera propiedad que creamos la llamaremos "Conexion"

    'como vemos la accesibilidad que tendrá es publica ,ósea no tendrá
    'restricciones en su uso.
    'ahora la propiedad que crearemos será de solo escritura
    'de allí la palabra reservada "WriteOnly", esto quiere decir que 
    'solo se asignara  un valor pero este no podrán ser recuperado ósea leído.

    'ahora también las propiedades pueden ser "ReadOnly" ,ósea que un valor de propiedad 
    'se puede recuperar pero no se puede modificar.

    'Ahora una propiedad también puede ser de lectura y de escritura
    'para ello solo tenemos que obviar esta parte quedando de la sgte manera:

    'Public Property CadenaSql () As string

    'sigamos...

    ' Las propiedades WriteOnly contienen bloques Set pero carecen de bloques Get,que si
    'están  presentes cuando las propiedades son ReadOnly, pero cuando las propiedades son de
    'lectura y escritura ambos bloques estarán presentes (set,get)
    'bueno no voy a profundizar mucho en esto así que se los dejo de tarea ok?
    'sigamos...

    Public WriteOnly Property Conexion() As SqlConnection ' esta propiedad nos sirve como su nombre los dice "para la conexión"
        Set(ByVal Value As SqlConnection) 'El bloque set se utiliza para establecer el valor de una propiedad
            'El nuevo valor de la propiedad se pasa al procedimiento de propiedad Set en un parámetro denominado
            ' value cuando el valor de la propiedad cambia. 
            conex = Value
        End Set
    End Property
    Public WriteOnly Property ProcedimientoAlmacenado() As String ' esta propiedad nos sirve para establecer el nombre del sp que estamos usando
        Set(ByVal Value As String)
            sp = Value
        End Set
    End Property
    Public Sub llenaCombo() ' este es el método que creamos para llenar el combo después
        ' de establecer las propiedades
        Try
            Dim cmd As New SqlCommand("" & sp & "", conex), Dr As SqlDataReader
            cmd.CommandType = CommandType.StoredProcedure
            Dr = cmd.ExecuteReader
            CboTodo.Items.Clear()
            lsid.Items.Clear()
            While Dr.Read
                'como se darán cuenta los datos los estoy llenando en 
                'un listbox(códigos)y combobox(descripciones)
                lsid.Items.Add(Trim(Dr(0)))
                CboTodo.Items.Add(Trim(Dr(1)))
            End While
            Dr.Close()
            cmd = Nothing
            conex.Close()
            Exit Sub
        Catch ex As Exception
            MessageBox.Show(ex.Message, "vb.net", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub
    Private Sub CboTodo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles CboTodo.SelectedIndexChanged

        lsid.SelectedIndex = CboTodo.SelectedIndex 'una vez que se encuentra
        ' todos los datos en el listbox y combobox,es necesario hacer que cuando se seleccione
        'una descripción su codigo tambien lo haga, ya veremos mas adelante porque???
    End Sub

Una vez terminado nuestro Super Combobox ahora veamos como lo usamos no??? Que es lo que mas nos interesa……. ta ta ta tannnn!!!!!

Bueno creemos un nuevo proyecto y le ponemos el nombre que mejor nos parezca, yo le pondré betoja_PrySuperComboBox, como se darán cuenta tiene las iniciales de mi nombre je je je es que me amo je je je je, ahhhhh este proyecto será una" APLICACIÓN PARA WINDOWS" no se olviden ok?

Sigamos….

Lo primero que tenemos que hacer es agregar nuestro control; Agréguenlo a la barra de herramientas ubicando la DLL del proyecto que creamos anteriormente, en mi caso lo llame Betoja_comboBoxPersonalizado (me refiero al proyecto donde creamos el super combobox) busquen donde lo guardaron y vayan al directorio “bin” y escojan esa “dll” ok?

Colaboraciones en el Guille

 

Colaboraciones en el Guille

Como vemos nos aparece en nuestro cuadro de herramientas (Mis controles de usuario) ahora solo tenemos que arrastrarlo a nuestro form OK?

Colaboraciones en el Guille

Ahora veamos el código:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'bien primeramente creamos nuestra connexión
        Dim Cn As New SqlConnection
        Cn.ConnectionString = "server=(local);database=Northwind;uid=sa;pwd=;"
        Cn.Open()
        'la base de datos a utilizar sera "Northwind" que se encuentra en el sql 2000
        'solo tendran que agregarle el siguiente  SP:

        'CREATE PROCEDURE Sp_DevuelveCategorias
        'AS
        'select CategoryId,CategoryName from Categories

        'Bien ahora,se acuerdan de las propiedades que creamos a nuestro super combobox
        ' la porpiedad "conexion" y "ProcedimientoAlmacenado"?, pues fijense aqui
        ' como es que nos sirven:

        ComboTodo1.Conexion = Cn ' aca pasamos la coneccion
        ComboTodo1.ProcedimientoAlmacenado = "sp_devuelveCategorias" ' aca pasamos el name del sp que tenemos en nuestra BD
        ComboTodo1.llenaCombo() ' y aca invocamos al metodo que tambien creamos se acuerdan???
        'que es el que llenara nuestro Super comboBox de datos.
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Se acuerdan tambien que en nuestro  Super ComboBox  incluimos un listbox
        'que fue Ocultado por alli y que se encargaba de almacenar los codigos de los
        'items Cargados  en nuestro ComboBox, pues bien aca les muestro como acceder y capturar el codigo del item seleccionado
        Dim codigo As String = ComboTodo1.lsid.SelectedItem ' que simple verdad, recuerden que "lsid" es el nombre del lisbox que le dimos cuando creamos Nuestro Super ComboBox
        'pero como es que pasa esto se preguntaran, pues agan memoria y revisen lo que hicimos 
        'en el evento selectecIndexChange del ComboBox
        MessageBox.Show(codigo, "vb.net", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End Sub
End Class
Bien!!!,hemos terminado por ahora y he tratado de ser lo mas especifico posible, no he querido cansarlos con mucha teoría pero queda de tarea para ustedes puessss je je je je y si existe dudas!!! Escríbanme!!!!;y no se olviden tambien de descargar el archivo para una mejor comprension del articulo.

Bueno me Despido por ahora y no se pierdan la segunda parte de este articulo,y por favor no se olviden de darme su boto en Panoramabox (que es esa cajita que esta al comenzar el articulo ok!!! je je je ), eso me servirá de aliento para seguir compartiendo lo que aprendo.. bye y gracias!!!

Castillo Vásquez Beto Javi - DCE2

Egresado de: Leonardo Da vinci

Trujillo-Perú

Colaboraciones en el Guille

Los Peruanos sí Podemos !!!


Espacios de nombres usados en el código de este artículo:

System.Data.SqlClient

 


Fichero con el código de ejemplo: Betoja_SuperComboBox.zip - 54.7 KB


ir al índice principal de el Guille