ComboBox Reutilizable en .Net



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, 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, porque lo que se necesita es guardar el código de la categoría y no la descripción ,bien eso no es complicado pero quita tiempo y hasta se vuelve aburrido!!!, bueno es precisamente aquí donde hace su aparición el ComboBox Reutilizable que vamos a crear , que nos va a servir para usarlo 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…

 

combobox_01

 

 

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??

 

combobox_02

 

Bien ahora buscamos la propiedad Modifiers de ambos controles y los colocamos en Public, por defecto estará en Friend, 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.

 

combobox_03

 

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

 

combobox_04

 

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.

 

    '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

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

    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 el por que.
    End Sub

Una vez terminado nuestro Combobox ahora veamos como lo usamos, lo cual es lo que mas nos interesa…

Bueno creemos un nuevo proyecto y le ponemos el nombre que mejor nos parezca, este proyecto será una” Aplicación para Windows”

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 busquen donde lo guardaron y vayan al directorio “bin” y escojan esa “dll”

 

combobox_05

 

combobox_06

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

 

combobox_07

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


Eso sería todo. ahora pueden utilizar su ComboBox en cualquier Form sin necesidad de estar creando otros nuevos.. Acuerdence P.O.O.  😉
Fuente: http://www.elguille.info

3 respuestas a ComboBox Reutilizable en .Net

  1. Emiliano dice:

    Hola, estuve viendo el ejemplo es bastante útil. Te explico mi caso, tengo un combo y quiero pasar los datos que obtengo desde un datareader y me da un pequeño error que no logro determinar, este es mi código.
    Saludos y Gracias:

    Private Sub frmConsultasParams_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    cboConsTipo.Enabled = False
    lblConTipo.Enabled = False
    Dim instanciapers As New Personas
    dr = instanciapers.DamePersonas
    Me.CargarCbo(Me.cboUsuario, dr, “Usuario”, “Usuario”)
    dr.Close()
    End Sub

    Private Sub CargarCbo(ByVal pCbo As ComboBox, ByVal pDr As SqlDataReader, ByVal pDisplayMember As String, ByVal pValueMember As String)
    Dim vector As New Collection
    Do While pDr.Read
    vector.Add(New ComboItem(pDr(pValueMember), pDr(pDisplayMember)))
    Loop
    pCbo.DataSource = vector
    pCbo.DisplayMember = “Etiqueta”
    pCbo.ValueMember = “Valor”
    If pDr.HasRows Then pCbo.SelectedIndex = 0
    End Sub

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: