sábado, 18 de julio de 2020

Combos anidadas, ListBox de selección y DataGridView

En este ejemplo vamos a ver cómo anidar varias combobox de manera que cargada la combo inicial, se carga una segunda combo tomando el valor elegido en la primera como parámetro de búsqueda para la segunda combo y así sucesivamente hasta la última.

En el caso de la la última combobox en vez de otra combo se cargará un listbox a partir del cual seleccionaremos uno, varios o ningún valor con botones de selección simple o múltiple.

En el ejemplo particular la primera combo cargará una lista de países, la segunda una lista de dominios que dependerá de cada país, por ejemplo, al seleccionar Francia en los dominios puede aparecer Tahití, Guayana, etc. 
A partir de cada Dominio se cargará un combo con los subdominios ( P. ej. provincias de cada dominio). El Ownership será la lista de responsables de cada territorio, Entidad Conceptual. será la lista de entidades a cargo de cada Ownership, (Por ejemplo, Carreteras, Sanidad, Educación) y finalmente Entidad de Explotación. será la lista de entidades derivadas de cada entidad principal. Por ejemplo si elegimos educación podemos tener Escuelas, Universidades, Institutos de investigación, etc.

Para realiza este ejemplo abrimos un proyecto de visual Basic y dibujamos un formulario como este:

formulario con combos y dos listbox


Una vez creado el formulario añadimos código para cargar la primera combo. Como hay varias creamos un procedimiento sub  genérico para cargar combos de este estilo.

Private Sub Cargacombo(ByVal strSelect As String, ByVal cboGenerica As ComboBox, Optional ByVal strParametro As String = "")
        Dim srSQL As IO.StreamReader
        Dim strConsulta As String
        Dim rsSQL As New ADODB.Recordset
        Dim dicGenerico As New Dictionary(Of String, String)
        Dim cmdPG As OleDb.OleDbCommand
        Dim dv As New DataView
        Dim oPar As OleDb.OleDbParameter
        Dim dA As New OleDb.OleDbDataAdapter

        If Not DS Is Nothing Then
            DS.Clear()
        End If

        DS = New DataSet
        srSQL = New System.IO.StreamReader(strStartupPath & strSelect)
        strConsulta = srSQL.ReadToEnd
        If cnxPD.State <> ConnectionState.Open Then
            cnxPD.Open()
        End If

        cmdPG = New OleDb.OleDbCommand(strConsulta, cnxPD)
        oPar = cmdPG.Parameters.Add("?", OleDb.OleDbType.VarChar, 50)

        oPar.Value = strParametro
        dA.SelectCommand = cmdPG
        dA.Fill(DS, "CARGACOMBO")
        cboGenerica.Items.Clear()

        dicGenerico.Clear()
        dv = DS.Tables("CARGACOMBO").DefaultView
        For Each drv As DataRowView In dv
            If Not dicGenerico.ContainsKey(drv(0)) Then
                dicGenerico.Add(drv(0), drv(1))
            End If
            'almacenamos los valores junto con su clave
            cboGenerica.Items.Add(New AddItem(drv(1), drv(0)))
        Next
End Sub

Este procedimiento toma como parámetros una cadena con la SELECT con la que se cargará el combo y el objeto de tipo combo a cargar. Ahora cargamos la primera combo desde el evento Load de la aplicación.

Private Sub frmListBox_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cboPais.Items.Clear()
        cboPais.Text = ""
        Cargacombo("\CargarPaises.sql", cboPais)
        btnAceptar.Enabled = False
 End Sub

La SELECT necesaria para la carga y llamada desde "\CargarPaises.sql"  es un módulo de texto .sql asociado al proyecto.

Archivo .sql asociado a un proyecto .NET

Y contiene la SELECT.

select COD_CAMPO,DES_CAMPO from PROPIETARIO.TABLA1

Una vez carga el primer combo (en nuestro caso un combo de países) , al elegir un país toma el valor elegido como parámetro para la siguiente SELECT. El código que va en el evento  SelectedIndexChanged del combo países es el siguiente: 

Private Sub cboPais_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboPais.SelectedIndexChanged

        cboDominio.Items.Clear()
        cboDominio.Text = ""
        cboSubdominio.Items.Clear()
        cboSubdominio.Text = ""
        cboOwner.Items.Clear()
        cboOwner.Text = ""
        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""
        Cargacombo("\CargarDominios.sql", cboDominio, DirectCast(Me.cboPais.SelectedItem, AddItem).Clave.ToString())
        btnAceptar.Enabled = False
End Sub


La llamada al objeto AddItem la hemos definido previamente como una clase  que nos permite guardar un diccionario clave-valor, (en este caso clave-nombre).

'Esta clase AddItem permite almacenar un diccionario clave-valor en un combobox
Public Class AddItem
    Private moClave As Object
    Private msNombre As String

    Public Sub New(ByVal Nombre As String, ByVal Clave As Object)
        msNombre = Nombre
        moClave = Clave
    End Sub

    Public Property Clave() As Object
        Get
            Return moClave
        End Get
        Set(ByVal Value As Object)
            moClave = Value
        End Set
    End Property

    Public Property Nombre() As String
        Get
            Return msNombre
        End Get
        Set(ByVal Value As String)
            msNombre = Value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return msNombre
    End Function
End Class

Al seleccionar un país, se rellena el combo de dominios tomando como parámetro el país elegido en la combo.  Me.cboPais.SelectedItem  el parámetro se pasa haciendo uso de la clase addItem de este modo:

DirectCast(Me.cboPais.SelectedItem, AddItem).Clave.ToString() 

Una vez rellenado el combo de dominio se procede del mismo modo con el resto de combos, el siguiente es el de subDominio.

Private Sub cboSubdominio_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboSubdominio.SelectedIndexChanged

        cboOwner.Items.Clear()
        cboOwner.Text = ""
        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""
        lstEntExpl.Items.Clear()
        frmNiveles.Cargacombo("\CargarOwnership.sql", cboOwner, DirectCast(Me.cboSubdominio.SelectedItem, AddItem).Clave.ToString())
End Sub

Se puede ver que la estructura es la misma, al llamar a una función genérica nos ahorramos escribir nuevo código cada vez y lo único que cambiamos es la llamada a archivo .sql

Procedemos de la misma forma con el resto de combos hasta el último. Si la select puede  ser la misma para varios combos se aprovechará el archivo .sql. En nuestro caso el combo de Entidad Conceptual se rrelena utilizando la misma SELECT que se utilizó para rellenar el Owner.

Private Sub cboOwner_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboOwner.SelectedIndexChanged

        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""
        Cargacombo("\CargarOwnership.sql", cboEntConceptual, DirectCast(Me.cboOwner.SelectedItem, AddItem).Clave.ToString())

End Sub

Para que esto sea posible, la SELECT ( y la tabla) son de este tipo:

select COD_CAMPO,DES_CAMPO from PROPIETARIO.TABLA where COD_CAMPO = ?

Esto es posible si en una tabla, el campo COD_CAMPO contiene códigos para varias descripciones, es decir en nuestro caso particular  prodríamos tener la tabla rellena con códigos del estilo OW0001, OW0002  para el Owner y EC0001, EC0002 para la entidad conceptual. Si no es el caso deberemos utilizar otro archivo .sql  diferente con la SELECT correspondiente. 

Para ver otra posibilidad, la entidad específica en vez de cargarse en un combo, la cargaremos en dos ListBox,con los correspondientes botones para traspasar la entidad elegida al listbox de muestra al de ejecución y viceversa (ver la primera imagen de esta entrada)  para ello en el evento IndexChanged del ultimo combo hacemos:

Private Sub cboEntConceptual_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboEntConceptual.SelectedIndexChanged

        Me.Cursor = Cursors.WaitCursor
        If Proceso = TipoProceso.BuscarInformacionSophia Then
            CargarListaEntExplotacion()
        Else
            Exit Sub
        End If
        Me.Cursor = Cursors.Default    
 End Sub

Y el procedimiento que carga el primer ListBox con CargarListaEntExplotacion() vendrá definido de este modo. 

Sub CargarListaEntExplotacion()

        Dim srSQL As IO.StreamReader
        Dim strConsulta As String
        Dim rsSQL As New ADODB.Recordset
        Dim cmdPG As OleDb.OleDbCommand
        Dim dv As New DataView
        Dim oPar As OleDb.OleDbParameter
        Dim dA As New OleDb.OleDbDataAdapter

        If DS Is Nothing Then
            Exit Sub
        End If

        If cboEntConceptual.Text = "" Then
            Exit Sub
        End If
        lstEntExplotacion.Items.Clear()
        If Not DS.Tables("ENTEXPL") Is Nothing Then
            DS.Tables("ENTEXPL").Clear()
        End If

        EscribirLog("Generando Diccionario Entidad Explotacion - " & Now.ToString("dd/MM/yyyy HH:mm:ss"))

        srSQL = New System.IO.StreamReader(strStartupPath & "\CargarEntExplotacion.sql")
        strConsulta = srSQL.ReadToEnd
        'Añado la consulta
        If cnxPD.State <> ConnectionState.Open Then
            cnxPD.Open()
        End If
        cmdPG = New OleDb.OleDbCommand(strConsulta, cnxPD)
        oPar = cmdPG.Parameters.Add("?", OleDb.OleDbType.VarChar, 50)
        oPar.Value = DirectCast(Me.cboEntConceptual.SelectedItem, AddItem).Clave.ToString()
        dA.SelectCommand = cmdPG
        dA.Fill(DS, "ENTEXPL")
        lstSeleccion.Items.Clear()
        dv = DS.Tables("ENTEXPL").DefaultView
       
 For Each drv As DataRowView In dv
            lstEntExplotacion.Items.Add(drv(1) & drv(0))
        Next
End Sub

La select de la carga del combo entidad explotación es esta, COD_ENTEXPL es el código de la entidad de explotación, DES_ENTEXPL es la descripción y COD_ENTCON es el código de la Entidad Conceptual:

select COD_ENTEXPL,DES_ENTEXPL from PROPIETARIO.TABLA1 where COD_ENTCON = ?

Este procedimiento carga un diccionario clave,valor con el código y la descripción de las entidades de explotación y el listbox con las descripciones y el código.

Ahora hay que definir los botones del centro, el primer botón > traspasa los elementos elegidos en la primera ListBox (lstEntExplotacion) a la segunda (lstSeleccion). El código comentado en verde sería por si deseamos mostrar las descripciones junto con sus códigos.

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click

        Dim EntExpl
        ' Dim EntCodigos
        Dim ilstEntExpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each EntExpl In lstEntExplotacion.SelectedItems
            lstSeleccion.Items.Add(EntExpl)
            ilstEntExpl.Add(EntExpl)
        Next
        iEnum = ilstEntExpl.GetEnumerator

        While iEnum.MoveNext
            lstEntExplotacion.Items.Remove(iEnum.Current)
        End While
        'Repito con códigos
        'Dim EntCodigos
        'Dim ilstCodigos As New List(Of String)
        'Dim iEnucod As IEnumerator
        'For Each EntCodigos In lstCodigos.SelectedItems
        '    lstElegidos.Items.Add(EntCodigos)
        '    ilstCodigos.Add(EntCodigos)
        'Next
        'iEnucod = ilstCodigos.GetEnumerator

        'While iEnum.MoveNext
        '    lstCodigos.Items.Remove(iEnucod.Current)
        'End While
        'Fin repito con codigos

        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
End Sub

El siguiente botón >> traspasa todos los elementos de la lista a la de seleccionados.

Private Sub btnAddAll_Click(sender As Object, e As EventArgs) Handles btnAddAll.Click
        Dim Entexpl
        Dim ilstEntExpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each Entexpl In lstEntExplotacion.Items
            lstSeleccion.Items.Add(Entexpl)
            ilstEntExpl.Add(Entexpl)
        Next
        iEnum = ilstEntExpl.GetEnumerator

        While iEnum.MoveNext
            lstEntExplotacion.Items.Remove(iEnum.Current)
        End While
        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
End Sub

El siguiente botón < elimina un elemento de los seleccionados y lo traspasa a la lista inicial.

Private Sub btnDel_Click(sender As Object, e As EventArgs) Handles btnDel.Click
        Dim EntExpl
        Dim ilstEntexpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each EntExpl In lstSeleccion.SelectedItems
            lstEntExplotacion.Items.Add(EntExpl)
            ilstEntexpl.Add(EntExpl)
        Next
        iEnum = ilstEntexpl.GetEnumerator

        While iEnum.MoveNext
            lstSeleccion.Items.Remove(iEnum.Current)
        End While


        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
 End Sub

Finalmente el botón << elimina todos los elementos seleccionados y los traspasa a la lista inicial.

Private Sub btnDelAll_Click(sender As Object, e As EventArgs) Handles btnDelAll.Click
        Dim EntExpl
        Dim ilstEntExpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each EntExpl In lstSeleccion.Items
            lstEntExplotacion.Items.Add(EntExpl)
            ilstEntExpl.Add(EntExpl)
        Next
        iEnum = ilstEntExpl.GetEnumerator

        While iEnum.MoveNext
            lstSeleccion.Items.Remove(iEnum.Current)
        End While


        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
End Sub

Cuando terminamos de seleccionar todos los elementos de los combos y del listbox de selección pulsamos el botón aceptar y tratamos los valores elegidos como deseemos. 

Private Sub btnAceptar_Click(sender As Object, e As EventArgs) Handles btnAceptar.Click

        Dim sCodEntExpl As String = ""
     
        If lstSeleccion.Items.Count <> 0 Then
            For Each strEntExpl In lstSeleccion.Items
                sCodEntExpl = sCodEntExpl & strEntExpl & "-"
            Next
            sCodEntExpl = Mid(sCodEntExpl, 1, Len(sCodEntExpl) - 1)
         
        End If
     
        var1 = cboPais.SelectedValue
        var2 = cboDominio.SelectedValue
        var3 = cboSubdominio.SelectedValue
        var4 = cboOwner.SelectedValue
        var5 = cboEntConceptual.SelectedValue
       
        End
 End Sub

Combos selección con DataGridView

En vez de dos ListBox con los valores a elegir mediante unos botones de selección-deselección, podemos sustituirla por un dataGridView. 
En la figura inferior, hemos sustituido los dos ListBox por un dataGridView.  Este dataGrid se carga con la lista de valores de la que podemos elegir una o varias filas con el ratón.

Combos anidadas con una grid

Lo único que cambia en esta pantalla es la función de carga  CargarListaEntExplotacion.


Sub CargarListaEntExplotacion()

        Dim srSQL As IO.StreamReader
        Dim strConsulta As String
        Dim rsSQL As New ADODB.Recordset
        Dim cmdPG As OleDb.OleDbCommand
        Dim dv As New DataView
        Dim oPar As OleDb.OleDbParameter
        Dim dA As New OleDb.OleDbDataAdapter
        Dim drFila As DataRow
        If DS Is Nothing Then
            Exit Sub
        End If

        If cboEntConceptual.Text = "" Then
            Exit Sub
        End If

        If Not DS.Tables("ENTEXPL") Is Nothing Then
            DS.Tables("ENTEXPL").Clear()
        End If

        EscribirLog("Generando Diccionario Entidad explotacion - " & Now.ToString("dd/MM/yyyy HH:mm:ss"))

        srSQL = New System.IO.StreamReader(strStartupPath & "\CargarEntExplotacion.sql")
        strConsulta = srSQL.ReadToEnd
        'Añado la consulta
        If cnxPD.State <> ConnectionState.Open Then
            cnxPD.Open()
        End If
        cmdPG = New OleDb.OleDbCommand(strConsulta, cnxPD)
        oPar = cmdPG.Parameters.Add("?", OleDb.OleDbType.VarChar, 50)
        oPar.Value = DirectCast(Me.cboEntConceptual.SelectedItem, AddItem).Clave.ToString()
        dA.SelectCommand = cmdPG
        dA.Fill(DS, "ENTEXPL")
        dv = DS.Tables("ENTEXPL").DefaultView

        grdEntExpl.DataSource = DS.Tables("ENTEXPL").DefaultView
        grdEntExpl.Columns(0).MinimumWidth = 70
        grdEntExpl.Columns(1).MinimumWidth = 400
        grdEntExpl.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        grdEntExpl.Columns(0).HeaderText = "Codigo"
        grdEntExpl.Columns(1).HeaderText = "Entidad de Explotación"

        lstEntExpl.Items.Clear()
        For Each drFila In DS.Tables("ENTEXPL").Rows
            lstEntExpl.Items.Add(drFila(0) & " - " & drFila(1))
        Next
End Sub

Y la funcionalidad del Botón aceptar.

Private Sub btnAceptar_Click(sender As Object, e As EventArgs) Handles btnSeleccionar.Click
        Dim sCodEntExpl As String = ""
        Dim ILst
        Dim aEntExpl() As String

        Dim i As Int16
        For Each rowGrid In grdEntExpl.SelectedRows
            sCodEntExpl = sCodEntExpl & grdEntExpl.SelectedRows.Item(i).Cells(0).Value & "-"
             
        Next
      
        If sCodEntExpl <> "" Then
            sCodEntExpl = Mid(sCodEntExpl, 1, Len(sCodEntExpl) - 1)
        End If
      
        End
End Sub


Finalmente se muestra el código completo. (de la versión de los dos ListBox)

Public Class frmCombos
    Dim strCarpeta As String
   Private Sub btnAceptar_Click(sender As Object, e As EventArgs) Handles btnAceptar.Click


        Dim sCodEntExpl As String = ""
     

        If lstSeleccion.Items.Count <> 0 Then
            For Each strEntExpl In lstSeleccion.Items
                sCodEntExpl = sCodEntExpl & strEntExpl & "-"
            Next
            sCodEntExpl = Mid(sCodEntExpl, 1, Len(sCodEntExpl) - 1)
         
        End If
     
        var1 = cboPais.SelectedValue
        var2 = cboDominio.SelectedValue
        var3 = cboSubdominio.SelectedValue
        var4 = cboOwner.SelectedValue
        var5 = cboEntConceptual.SelectedValue
       
        End

    End Sub

    Private Sub cboPais_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboPais.SelectedIndexChanged

        cboDominio.Items.Clear()
        cboDominio.Text = ""
        cboSubdominio.Items.Clear()
        cboSubdominio.Text = ""
        cboOwner.Items.Clear()
        cboOwner.Text = ""
        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""
        Cargacombo("\CargarDominios.sql", cboDominio, DirectCast(Me.cboPais.SelectedItem, AddItem).Clave.ToString())
        btnAceptar.Enabled = False
    End Sub

    Private Sub frmHistoriaUsuario_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cboPais.Items.Clear()
        cboPais.Text = ""
        Cargacombo("\CargarPaises.sql", cboPais)
        btnAceptar.Enabled = False
    End Sub

    Private Sub cboDominio_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboDominio.SelectedIndexChanged

        cboSubdominio.Items.Clear()
        cboSubdominio.Text = ""
        cboOwner.Items.Clear()
        cboOwner.Text = ""
        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""


        Cargacombo("\CargarSubDominios.sql", cboSubdominio, DirectCast(Me.cboDominio.SelectedItem, AddItem).Clave.ToString())

        btnAceptar.Enabled = True
    End Sub

    Private Sub cboSubdominio_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboSubdominio.SelectedIndexChanged

        cboOwner.Items.Clear()
        cboOwner.Text = ""
        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""
        Cargacombo("\CargarOwnership.sql", cboOwner, DirectCast(Me.cboSubdominio.SelectedItem, AddItem).Clave.ToString())

    End Sub

    Private Sub cboOwner_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboOwner.SelectedIndexChanged

        cboEntConceptual.Items.Clear()
        cboEntConceptual.Text = ""
        cboEntExplotacion.Items.Clear()
        cboEntExplotacion.Text = ""
        Cargacombo("\CargarOwnership.sql", cboEntConceptual, DirectCast(Me.cboOwner.SelectedItem, AddItem).Clave.ToString())

    End Sub

    Private Sub cboEntConceptual_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboEntConceptual.SelectedIndexChanged

        Me.Cursor = Cursors.WaitCursor
        If Proceso = TipoProceso.BuscarInformacionSophia Then
            CargarListaEntExplotacion()
        Else
            Exit Sub
        End If
        Me.Cursor = Cursors.Default
      

    End Sub

    Sub CargarListaEntExplotacion()

        Dim srSQL As IO.StreamReader
        Dim strConsulta As String
        Dim rsSQL As New ADODB.Recordset
        Dim cmdPG As OleDb.OleDbCommand
        Dim dv As New DataView
        Dim oPar As OleDb.OleDbParameter
        Dim dA As New OleDb.OleDbDataAdapter

        If DS Is Nothing Then
            Exit Sub
        End If

        If cboEntConceptual.Text = "" Then
            Exit Sub
        End If
        lstEntExplotacion.Items.Clear()
        If Not DS.Tables("ENTEXPL") Is Nothing Then
            DS.Tables("ENTEXPL").Clear()
        End If

        EscribirLog("Generando Diccionario Entidad explotacion - " & Now.ToString("dd/MM/yyyy HH:mm:ss"))

        srSQL = New System.IO.StreamReader(strStartupPath & "\CargarEntExplotacion.sql")
        strConsulta = srSQL.ReadToEnd
        If cnxPD.State <> ConnectionState.Open Then
            cnxPD.Open()
        End If
        cmdPG = New OleDb.OleDbCommand(strConsulta, cnxPD)
        oPar = cmdPG.Parameters.Add("?", OleDb.OleDbType.VarChar, 50)
        oPar.Value = DirectCast(Me.cboEntConceptual.SelectedItem, AddItem).Clave.ToString()
        dA.SelectCommand = cmdPG
        dA.Fill(DS, "ENTEXPL")
        lstSeleccion.Items.Clear()
        dv = DS.Tables("ENTEXPL").DefaultView
      
    End Sub

    Private Sub Cargacombo(ByVal strSelect As String, ByVal cboGenerica As ComboBox, Optional ByVal strParametro As String = "")
        Dim srSQL As IO.StreamReader
        Dim strConsulta As String
        Dim rsSQL As New ADODB.Recordset
        Dim dicGenerico As New Dictionary(Of String, String)
        Dim cmdPG As OleDb.OleDbCommand
        Dim dv As New DataView
        Dim oPar As OleDb.OleDbParameter
        Dim dA As New OleDb.OleDbDataAdapter

        If Not DS Is Nothing Then
            DS.Clear()
        End If

        DS = New DataSet
        srSQL = New System.IO.StreamReader(strStartupPath & strSelect)
        strConsulta = srSQL.ReadToEnd
        If cnxPD.State <> ConnectionState.Open Then
            cnxPD.Open()
        End If

        cmdPG = New OleDb.OleDbCommand(strConsulta, cnxPD)
        oPar = cmdPG.Parameters.Add("?", OleDb.OleDbType.VarChar, 50)

        oPar.Value = strParametro
        dA.SelectCommand = cmdPG
        dA.Fill(DS, "CARGACOMBO")
        cboGenerica.Items.Clear()

        dicGenerico.Clear()
        dv = DS.Tables("CARGACOMBO").DefaultView
        For Each drv As DataRowView In dv
            If Not dicGenerico.ContainsKey(drv(0)) Then
                dicGenerico.Add(drv(0), drv(1))
            End If
            'almacenamos los valores junto con su clave
            cboGenerica.Items.Add(New AddItem(drv(1), drv(0)))
        Next
    End Sub

    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click

        Dim EntExpl
        ' Dim EntCodigos
        Dim ilstEntExpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each EntExpl In lstEntExplotacion.SelectedItems
            lstSeleccion.Items.Add(EntExpl)
            ilstEntExpl.Add(EntExpl)
        Next
        iEnum = ilstEntExpl.GetEnumerator

        While iEnum.MoveNext
            lstEntExplotacion.Items.Remove(iEnum.Current)
        End While
        'Repito con códigos
        'Dim EntCodigos
        'Dim ilstCodigos As New List(Of String)
        'Dim iEnucod As IEnumerator
        'For Each EntCodigos In lstCodigos.SelectedItems
        '    lstElegidos.Items.Add(EntCodigos)
        '    ilstCodigos.Add(EntCodigos)
        'Next
        'iEnucod = ilstCodigos.GetEnumerator

        'While iEnum.MoveNext
        '    lstCodigos.Items.Remove(iEnucod.Current)
        'End While
        'Fin repito con codigos

        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If

    End Sub

    Private Sub btnAddAll_Click(sender As Object, e As EventArgs) Handles btnAddAll.Click
        Dim Entexpl
        Dim ilstEntExpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each Entexpl In lstEntExplotacion.Items
            lstSeleccion.Items.Add(Entexpl)
            ilstEntExpl.Add(Entexpl)
        Next
        iEnum = ilstEntExpl.GetEnumerator

        While iEnum.MoveNext
            lstEntExplotacion.Items.Remove(iEnum.Current)
        End While


        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
    End Sub

    Private Sub btnDel_Click(sender As Object, e As EventArgs) Handles btnDel.Click
        Dim EntExpl
        Dim ilstEntexpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each EntExpl In lstSeleccion.SelectedItems
            lstEntExplotacion.Items.Add(EntExpl)
            ilstEntexpl.Add(EntExpl)
        Next
        iEnum = ilstEntexpl.GetEnumerator

        While iEnum.MoveNext
            lstSeleccion.Items.Remove(iEnum.Current)
        End While


        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
    End Sub

    Private Sub btnDelAll_Click(sender As Object, e As EventArgs) Handles btnDelAll.Click
        Dim EntExpl
        Dim ilstEntExpl As New List(Of String)
        Dim iEnum As IEnumerator
        For Each EntExpl In lstSeleccion.Items
            lstEntExplotacion.Items.Add(EntExpl)
            ilstEntExpl.Add(EntExpl)
        Next
        iEnum = ilstEntExpl.GetEnumerator

        While iEnum.MoveNext
            lstSeleccion.Items.Remove(iEnum.Current)
        End While


        If lstSeleccion.Items.Count > 0 Then
            btnAceptar.Enabled = True
        Else
            btnAceptar.Enabled = False
        End If
    End Sub


End Class

'Esta clase AddItem permite almacenar un diccionario clave-valor en un combobox
Public Class AddItem
    Private moClave As Object
    Private msNombre As String

    Public Sub New(ByVal Nombre As String, ByVal Clave As Object)
        msNombre = Nombre
        moClave = Clave
    End Sub

    Public Property Clave() As Object
        Get
            Return moClave
        End Get
        Set(ByVal Value As Object)
            moClave = Value
        End Set
    End Property

    Public Property Nombre() As String
        Get
            Return msNombre
        End Get
        Set(ByVal Value As String)
            msNombre = Value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return msNombre
    End Function
End Class

1 comentario:

  1. This is a great post and the information written in this post is true and well-founded because the information in it is given in full detail, that's why I got very interested in this blog. Thank you for giving this article, if you have any information related to server hosting or to buy a high-tech server, then contact USA VPS Hosting and how it can be important for this modern world. Thanks once again.





    ResponderEliminar