none
Padre e hijos en dos List view [Solucionado] RRS feed

  • Pregunta

  • Hola a todos, estoy un poco parado ya que no sé como hacerlo, se que se puede, el problema que hace poco que me he iniciado en vb.net y aúnun no conozco bien los codigos. El tema es, que tengo una tabla Access con dos tablas A y B, ambas tablas estan relacionadas entre si y lo que quiero, es que en un Listview se vean los datos de la tabla A y en el otro listview se vean los datos de la tabla B, pero... segun haya selecionado el registro del primer listview.  Pongo el codigo.


      Private Sub FormDataConfig_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

            Me.ATableAdapter.Fill(Me.CIFDataSet.A)
            Me.BTableAdapter.Fill(Me.CIFDataSet.B)

            DA.Fill(DT)


            With ListViewA
                'Configuración
                .Columns.Clear()
                .Items.Clear()
                .View = View.Details
                .GridLines = True
                .Scrollable = True
                .HideSelection = False
                .Columns.Add("Nivel", 50, HorizontalAlignment.Left)
                .Columns.Add("Titulo", 155, HorizontalAlignment.Left)
                .Columns.Add("Imagen", 165, HorizontalAlignment.Left)
                .Columns.Add("Posición Icono", 175, HorizontalAlignment.Left)
                .Columns.Add("Posición Texto", 185, HorizontalAlignment.Left)
                .Columns.Add("Estado", 195, HorizontalAlignment.Left)
                .FullRowSelect = True
            End With

            Dim MR As DataRow


            For Each MR In Me.CIFDataSet.A.Rows 'DT.Rows
                ListViewA.Items.Add(MR.Item(0))
                ListViewA.Items(ListViewA.Items.Count - 1).SubItems.Add(MR.Item(1))
                ListViewA.Items(ListViewA.Items.Count - 1).SubItems.Add(MR.Item(2))
                ListViewA.Items(ListViewA.Items.Count - 1).SubItems.Add(MR.Item(3))
                ListViewA.Items(ListViewA.Items.Count - 1).SubItems.Add(MR.Item(4))
                ListViewA.Items(ListViewA.Items.Count - 1).SubItems.Add(MR.Item(5))
            Next

        End Sub

    En el codigo de abajo es del segundo listview y dependiendo del registro del listview1 motrar los datos relacionados en el segundo listview.

          

        Private Sub ListViewA_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListViewA.SelectedIndexChanged


            '------------------------------------------------------------------------
            With ListViewB
                'Configuración
                .Columns.Clear()
                .Items.Clear()
                .View = View.Details
                .GridLines = True
                .Scrollable = True
                .HideSelection = False
                .Columns.Add("Nivel", 50, HorizontalAlignment.Left)
                .Columns.Add("Titulo", 155, HorizontalAlignment.Left)
                .Columns.Add("Imagen", 165, HorizontalAlignment.Left)
                .Columns.Add("Posición Icono", 175, HorizontalAlignment.Left)
                .Columns.Add("Posición Texto", 185, HorizontalAlignment.Left)
                .Columns.Add("Estado", 195, HorizontalAlignment.Left)
                .Columns.Add("NivelA", 195, HorizontalAlignment.Left)
                .Columns.Add("Path Documento", 195, HorizontalAlignment.Left)
                .FullRowSelect = True
            End With


            For i As Int16 = 0 To ListViewA.SelectedIndices.Count - 1

                Dim capturalista = ListViewA.SelectedItems.Item(i).Text  ' aqui seleciono el registro del listview1

            Next


            Dim MR As DataRow


            For Each MR In CIFDataSet.B.Rows

                With ListViewB
                    .Items.Add(MR.Item(0))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(1))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(2))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(3))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(4))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(5))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(6))
                    .Items(ListViewB.Items.Count - 1).SubItems.Add(MR.Item(7))
                End With
            Next


            Me.ListViewB.SelectedItems.Clear()



        End Sub

    Haber si me podéis echar una mano, como pasar el valor capturado en la variable capturalista para que el listview2 cargue los datos segun criterio. El valor de ListViewA.Items.Add(MR.Item(0)) debe ser = ListViewb.Items.Add(MR.Item(6))



    • Editado Andiamos domingo, 22 de enero de 2017 9:55
    miércoles, 23 de noviembre de 2016 17:33

Respuestas

  • Andiamos,

    Filtra las filas dependientes a partir de la columna referencia que entiendo se encuentra en ambos conjuntos de datos.

    Entendiendo que ambos objetos de tipo DataTable contiene un campo en común puedes hacer lo siguiente:

    Private Sub ListViewA_SelectedIndexChanged(sender As ...
    
    	Dim ValorRef As String = ListViewA.SelectedItems(0).Text
    
    	ListViewB.Items.Clear()
    
    	For Each row As DataRow In dt.Rows.Cast(Of DataRow)().
    		Where(Function(x) x.Field(Of String)("COL_REF") = ValorRef)
    
    		With ListViewB
    			.Items.Add(row.Item(0))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(1))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(2))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(3))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(4))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(5))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(6))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(7))
    		End With
    	Next
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 23 de noviembre de 2016 23:47

Todas las respuestas

  • Andiamos,

    Filtra las filas dependientes a partir de la columna referencia que entiendo se encuentra en ambos conjuntos de datos.

    Entendiendo que ambos objetos de tipo DataTable contiene un campo en común puedes hacer lo siguiente:

    Private Sub ListViewA_SelectedIndexChanged(sender As ...
    
    	Dim ValorRef As String = ListViewA.SelectedItems(0).Text
    
    	ListViewB.Items.Clear()
    
    	For Each row As DataRow In dt.Rows.Cast(Of DataRow)().
    		Where(Function(x) x.Field(Of String)("COL_REF") = ValorRef)
    
    		With ListViewB
    			.Items.Add(row.Item(0))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(1))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(2))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(3))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(4))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(5))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(6))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(7))
    		End With
    	Next
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 23 de noviembre de 2016 23:47
  • Buenos días

    he realizado dos modificaciones, en el DT ya que si no llama a la primera Tabla y en la variable valorRef ya que al ser string no permitía hacer la conversión 

    DA.Fill(DS, "B")

    For i As Int16 = 0 To ListViewA.SelectedIndices.Count - 1

                Dim ValorRef= ListViewA.SelectedItems.Item(i).Text 

            Next

    Te doy las gracias por tu gran ayuda, me hubiera costado horrores llegar hasta ahí.

    Un saludo

    jueves, 24 de noviembre de 2016 6:46
  • Andiamos,

    Filtra las filas dependientes a partir de la columna referencia que entiendo se encuentra en ambos conjuntos de datos.

    Entendiendo que ambos objetos de tipo DataTable contiene un campo en común puedes hacer lo siguiente:

    Private Sub ListViewA_SelectedIndexChanged(sender As ...
    
    	Dim ValorRef As String = ListViewA.SelectedItems(0).Text
    
    	ListViewB.Items.Clear()
    
    	For Each row As DataRow In dt.Rows.Cast(Of DataRow)().
    		Where(Function(x) x.Field(Of String)("COL_REF") = ValorRef)
    
    		With ListViewB
    			.Items.Add(row.Item(0))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(1))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(2))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(3))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(4))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(5))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(6))
    			.Items(ListViewB.Items.Count - 1).SubItems.Add(row.Item(7))
    		End With
    	Next
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Hola de nuevo Williams,

    Porque cuando hago un update se guarda en la tabla de access pero en el  listview no se actualiza la lista.

    he borrado el listview con clear() pero al volverlo a cargar me salen los mismos registros no aparece el update.

    Un saludo

    viernes, 23 de diciembre de 2016 15:18