Colaboraciones en el Guille

Creando un Súper ComboBox en vb.net - II

 

Fecha: 21/Ene/2006 (20/01/06)
Autor: Beto Javi Castillo Vásquez - becavas@hotmail.com


Castillo Vásquez Beto Javi
Informatico-DCE2
Egresado de: Leonardo Da Vinci
Trujillo-Perú

Perú

Los Peruanos Sí Podemos

autor

¡Hola mundo!, Aquí esta nuevamente su humilde servidor para seguir compartiendo con ustedes las maravillas que se pueden hacer con las tecnologías .net; espero también que hayan disfrutado del articulo que escribí anteriormente, además quiero agradecer infinitamente a aquellos que me dieron sus votos en “Panoramabox” ya que estos son la única retribución que tenemos todos los loquillos.net de esta comunidad de parte de ustedes, así que como se podrán dar cuenta ustedes son nuestra fuerza inspiradora para seguir haciendo de esta comunidad una de las más activas en el medio. Pido también disculpas por la demora en la publicación de la segunda versión de este articulo, es que no me ha tratado muy bien este nuevo año pero aquí estoy devuelta otra vez dándole una cachetada a la adversidad je je je.

Antes de empezar a desarrollar nuestro artículo quiero que sepan que es requisito indispensable que hayan leído y entendido el artículo publicado anteriormente y si no es así entonces es hora de que lo hagan de lo contrario en este articulo estarán algo perdidos puesto que no pienso volver a explicar lo que ya lo hice en el articulo anterior OK?, Pueden Acceder al artículo anterior desde este enlace: http://www.elguille.info/colabora/NET2005/betoja_SuperComboBox.htm

Bien ahora ya estamos listos para empezar con nuestro artículo, y como alguien dijo por allí “Que la fuerza te acompañe” pues yo digo “Que el conocimiento nos acompañe” je je je. En el articulo anterior (Creando un Súper Combox en vb.net – I) vimos como podíamos crear nuestro control personalizándolos como mejor nos parecía además de ello le creamos sus propiedades y métodos, bien pues ahora haremos lo mencionado además de crearle sus propios eventos, no es genial?, sí verdad?. Tras la publicación del articulo anterior recibí muchos comentarios y uno de ellos fue de ¿Porque tener una lista para almacenar los códigos si el ComboBox tiene una propiedad llamada valueMember donde se pueden almacenar estos? Bueno pues en este articulo aplicaremos el uso de esta propiedad y cada uno sacara sus conclusiones de cual de las dos formas es mas óptima o se adapta a nuestras necesidades y para hacerlo mas interesante la funcionalidad del súper ComboBox será diferente al primero. La Funcionalidad que tendrá el Súper ComboBox que crearemos es de un buscador-Filtrador, donde se teclea la primera letra de lo que se va a buscar y presionando enter el Combobox se llenara todos los datos que coincidan con lo tecleado, ojo que mientras mas letras sean tecleadas mas restringida será la búsqueda, bueno creo que esto no necesita mucha explicación puesto que creo que son muy inteligentes, además que tienen acceso a descargar el código fuente y ver la funcionalidad de lo que vamos a hacer.

Bien, primeramente empezamos creando nuestro proyecto para el súper ComboBox (Biblioteca de controles de Windows) y agregaremos en el UserControl un Combobox y configuramos las propiedades de este (Anchor,Modifiers) enseguida ajustamos el userControl al combobox de tal manera que solo se vea el combobox,como verán no estoy entrando en detalles en esta parte porque como dije anteriormente no repetiré lo que ya hicimos en el articulo anterior, OK?.Además es casi lo mismo lo que haremos aquí.

veamos el código:

    Public Event CuandoHagoEnter() 'de esta manera declaramos y Creamos  nuestro Propio evento
    Private conex As SqlConnection
    Private sp, cpo, Abusc As String
    'Bien acontinuacion se crean las propiedades que tendrá nuestro control
    'como veran algunas propiedades son iguales a las que hicimos en el articulo
    'anterior y en cuanto a las nuevas que ven, ya veremos como es que nos sirve
    'cuando estemos reutilizando nuestro control.
    Public WriteOnly Property Coneccion() As SqlConnection
        Set(ByVal Value As SqlConnection)
            conex = Value
        End Set
    End Property
    Public WriteOnly Property ProcedimientoAlmacenado() As String
        Set(ByVal Value As String)
            sp = Value
        End Set
    End Property
    Public WriteOnly Property NombParametroSp() As String
        Set(ByVal Value As String)
            cpo = Value
        End Set
    End Property
    Public WriteOnly Property CriterioDeBusqueda() As String
        Set(ByVal Value As String)
            Abusc = Value
        End Set
    End Property
    Private Sub cbofiltrar_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _
    Handles cbofiltrar.KeyPress 
        'Esta es la parte del código que permitirá al nuestro combobox funcionar
        Try
            If e.KeyChar = Chr(13) And cbofiltrar.Text <> "" Then
                RaiseEvent CuandoHagoEnter() 'bien de esta manera invocamos nuestro
                'evento creado,de tal manera que el código que hayamos escrito en este
                'se ejecutara aquí. (el código al que hago mansión es el que se escribirá
                'en el evento "CuandoHagoEnter" pero cuando instanciemos nuestro control
                'desde un Form)
                Dim da As New SqlDataAdapter, Tabla As New DataTable
                With da
                    'áqui vemos la otra forma de trabajar sin utilizar una
                    'lista para guardar nuestros códigos como lo hicimos en
                    'el articulo anterior."ojo" siempre tratando de trabajar
                    'con stored procedures.
                    .SelectCommand = New SqlCommand("" & sp & "", conex)
                    .SelectCommand.CommandType = CommandType.StoredProcedure
                    .SelectCommand.Parameters.Add("@" & cpo & "", SqlDbType.VarChar).Value = Abusc
                    cbofiltrar.DataSource = Nothing
                    .Fill(Tabla)
                    cbofiltrar.DataSource = Tabla
                    cbofiltrar.DisplayMember = "CategoryName"
                    cbofiltrar.ValueMember = "CategoryId"
                    da.Dispose()
                    conex.Close()
                    Exit Sub
                End With
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "vb.net", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub
End Class

 

Seguramente se estarán preguntando cual es el motivo o la finalidad de crear un evento para nuestro control, bien, si son curiosos se darán cuenta que cuando estemos instanciando nuestro control desde nuestro Form y tratamos de programar en el evento keypress del combobox nos daremos cuenta que no tenemos el control sobre este evento!!!!. Ahora si nos damos cuenta en el proyecto del control personalizado que acabamos de ver nos encontramos con un "UserControl" y un "Combobox" y que podemos controlar sus eventos independientemente de a cada uno de ellos, pero esto cambia cuando estamos instanciandolo desde un Form puesto que ahora se comportaran como uno solo. entonces en que momento enviamos los parámetros para que nuestro superCombo realice su trabajo? porque lo que yo quiero es que cuando haga "enter" mi control comience a funcionar y si no puedo controlar este evento? (Keypress del ComboBox) he aquí entonces la razón de crear nuestro propio evento.

Veamos ahora nuestro control en acción,ok? ahhhh y creo que no es necesario repetir como instanciar nuestro control desde el Form porque ya lo vimos en le articulo anterior.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Cn.ConnectionString = "server=(local);database=Northwind;uid=sa;pwd=;"
        Cn.Open()
    End Sub
	  Private Sub ComboFiltra1_CuandoHagoEnter() Handles ComboFiltra1.CuandoHagoEnter
	'Se acuerdan del evento que creamos para nuestro control,pues dentro de el 
	'estamos programando!!
	'---------------------------------------------
'nota: este SP de veran estar en la BD Northwind
'CREATE PROCEDURE FiltraCategorias
'@desc varchar(20)
'AS
'select CategoryName,CategoryId from Categories 'where rtrim(ltrim(CategoryName))LIKE rtrim(ltrim(@desc))+'%'
'---------------------------------------------- With ComboFiltra1 .ProcedimientoAlmacenado = "FiltraCategorias" .Coneccion = Cn .NombParametroSp = "Desc" .CriterioDeBusqueda = ComboFiltra1.cbofiltrar.Text.Trim End With 'como podrán ver estos parámetros necesitaban ser enviados desde este proyecto 'cuando se hiciera "enter" pero como no teníamos el control sobre Keypress entonces 'por eso este evento. End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = ComboFiltra1.cbofiltrar.SelectedValue 'Se acuerdan que antes accediamos a una pequeña lista para 'mostrar el código del ítem seleccionado, bien pues acá lo hacemos 'simplemente a la propiedad SelectedValue del combobox. End Sub End Class

 

bien, hemos finalizado este articulo y dejo a criterio de cada uno de ustedes sobre cual de las dos formas de almacenar los Códigos que hemos visto en los dos artículos publicados es la mejor o se adapta a sus necesidades, si en una lista? o en la propiedad valueMember?,puesto que ya vimos las dos formas. Particularmente por cuestiones de estética me quedo con la del primer articulo, y ya saben que sus comentarios y preguntas son bienvenidas ya que estamos para aprender y compartir lo aprendido.

Termino regalándoles algo que aprendí en estos días de adversidad :

"El éxito es solo para aquellos que son capaces de ver Luz donde todos ven oscuridad "

"El éxito es para aquellos que después de caer 100 veces se levantan 101 veces"

¡Hasta la próxima !

 

 


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

System.Data.SqlClient

 


Fichero con el código de ejemplo: Betoja_SuperComboBox_II.zip -  60.6 KB

(MD5 checksum: 99593FAA86EDEEEDB89732AADFA137F2)


ir al índice principal del Guille