none
Abrir nueva ventana al seleccionar una fila en el listview y otros... RRS feed

  • Pregunta

  • Hola a todos, estoy desarrollando un pequeño programilla en vb2008 conectado a una base sqlite (larga vida a sqlite) y el programa arranca con un listview en la pantalla principal donde muestro proveedores, fechas, nros de facturas, importes y otros pequeños datillos todos relacionados con las compras de un local.

    Resulta que tengo la loca idea de que al seleccionar una linea del listview al presionar enter o doble clic me abra otra ventana con el detalle de toda la linea, incluso me mostraria campos que no muestro en el listview principal.

    Pensaba en esta opcion o la otra es colocar una serie de textboxes en la parte inferior del listview con todos los datos que iba a mostrar en la ventana emergente. Con lo cual quedaria muy cargada la pantalla, por eso lo de la pantalla emergente.

    La consulta es: como hago, seleccionando algo en el formulario inicial, levanto los datos desde el formulario emergente.

    Segundo tema. Tengo importes en tres columnas del listiview. Quisiera que al cargar los datos en las columnas, poder ponerles un formato de moneda, o caso contrario formato numerico con dos decimales. Ahora me carga por ejemplo: 32 cuando tendria que ponerme 32.00 ó me carga 35.5 cuando me tendria que poner 35.50. Si pudiera poner simbolo pesos mejor !!!.

    Si alguien puede ayudarme se lo agradezco de antemano

    Saludos

    jueves, 5 de agosto de 2010 22:08

Respuestas

  • "Ubuntu-Man" preguntó:

    > como hago, seleccionando algo en el formulario inicial, levanto
    > los datos desde el formulario emergente.

    Hola:

    "Levantar", no sé cómo vas a poder "levantar los datos". :-)

    Pero "mostrar los datos" del elemento del control ListView sobre el que se ha efectuado doble clic, es muy fácil.

    En el evento DoubleClick del control ListView, simplemente ejecutarías:

        Private Sub ListView1_DoubleClick( _
            ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles ListView1.DoubleClick

            ' Referenciamos la colección ListViewSubItemCollection del
            ' elemento sobre el que se ha efectuado el doble clic.
            '
            Dim subItemsCollection As ListViewItem.ListViewSubItemCollection = _
                ListView1.SelectedItems(0).SubItems

            ' Se lo pasamos al segundo formulario.
            '
            Dim frm As New Form2(subItemsCollection)

            frm.ShowDialog()

            frm.Dispose()

        End Sub

    Fíjate que creo la instancia del segundo formulario de la siguiente manera:

            Dim frm As New Form2(subItemsCollection)

    Eso significa que el constructor del formulario Form2, tiene que estar definido de la siguiente manera:

    Public Class Form2()

        Public Sub New(ByVal subItem As ListViewItem.ListViewSubItemCollection)


        End Sub

    End Class

    Esto es así para que puedas pasar objetos, controles, variables, etc., entre formularios.

    Ahora, vamos a imaginar que en el formulario Form2 tienes siete controles TextBox y dos controles CheckBox (para valores booleanos). Rellenarías los controles de la siguiente manera:

    Public Class Form2

        Private m_subItem As ListViewItem.ListViewSubItemCollection

        Public Sub New(ByVal subItem As ListViewItem.ListViewSubItemCollection)

            ' Llamada necesaria para el diseñador.
            InitializeComponent()

            ' Le asignamos el valor al campo del formulario.
            '
            m_subItem = subItem

            ' Rellenamos los valores de los distintos controles TextBox.
            '
            TextBox1.Text = m_subItem(0).Text
            TextBox2.Text = m_subItem(1).Text
            TextBox3.Text = m_subItem(2).Text
            TextBox4.Text = m_subItem(3).Text
            TextBox5.Text = m_subItem(4).Text
            TextBox6.Text = m_subItem(5).Text
            CheckBox1.Checked = CBool(m_subItem(6).Text)
            CheckBox2.Checked = CBool(m_subItem(7).Text)
            TextBox7.Text = m_subItem(8).Text

        End Sub

    End Class

    Y si por casualidad, deseas modificar la propiedad Text del elemento del control ListView pasado, con los valores existentes en los controles TextBox y CheckBox, puedes hacer uso del evento FormClosing del formulario Form2 para dicho propósito:

        Private Sub Form2_FormClosing( _
            ByVal sender As Object, _
            ByVal e As FormClosingEventArgs) Handles Me.FormClosing

            ' Se está cerrando el formulario; actualizamos
            ' el valor del objeto ListViewSubItemCollection.
            '
            m_subItem(0).Text = TextBox1.Text
            m_subItem(1).Text = TextBox2.Text
            m_subItem(2).Text = TextBox3.Text
            m_subItem(3).Text = TextBox4.Text
            m_subItem(4).Text = TextBox5.Text
            m_subItem(5).Text = TextBox6.Text
            m_subItem(6).Text = CStr(CheckBox1.Checked)
            m_subItem(7).Text = CStr(CheckBox2.Checked)
            m_subItem(8).Text = TextBox7.Text

        End Sub

    > Segundo tema. Tengo importes en tres columnas del listiview. Quisiera que al cargar
    > los datos en las columnas, poder ponerles un formato de moneda, o caso contrario
    > formato numerico con dos decimales. Ahora me carga por ejemplo: 32 cuando tendria
    > que ponerme 32.00 ó me carga 35.5 cuando me tendria que poner 35.50.

    Mira que os gusta hacer varias preguntas en la misma conversación. :-)

    Antes de llamar al método «Add» de la propiedad «SubItems» del objeto ListViewItem, tienes que FORMATEAR el valor tal cual deseas mostrarlo.

    Si solamente deseas mostrar el número con dos decimales, lo harías de la siguiente manera:

         Dim valor As String = String.Format("{0:N2}", 32)

         item.SubItems.Add(valor)

         valor = String.Format("{0:N2}", 35.5)

         item.SubItems.Add(valor)

    Se comprende que la variable objeto «item» referencia a un objeto ListViewItem, y que 32 y 35.5 son los valores que deseas formatear y añadirlos a la colección SubItems.

    > Si pudiera poner simbolo pesos mejor !!!.

    También puedes formatear el valor con el símbolo monetario que actualmente aparece en la configuración regional de tu sistema operativo. Para ello, en lugar de una N puedes especificar una C:

         valor = String.Format("{0:C2}", 35.5)

         item.SubItems.Add(valor)

    ¡Eso es todo!

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    sábado, 7 de agosto de 2010 6:45
    Moderador
  • Ubuntu-Man" preguntó:
     
    > y como puedo colorear una fila en particular del listview?
     
    ¿Otra pregunta más? Pero, ¿por qué no inicias una nueva conversación para la nuevas preguntas que te surgan? :-)
     
    Una vez que referencies el objeto ListViewItem correspondiente a la fila que deseas colorear, tienes que establecer explícitamente el valor False a su propiedad UseItemStyleForSubItems, para indicar que los subelementos van a utilizar valores diferentes del elemento para la fuente, color de primer plano y color de fondo.
    Para ello te puede servir el siguiente procedimiento, al cual necesitarás pasar el número de fila (en base cero) y el color con el que deseas colorear la fila:
        Private Sub SetBackColorSubItems(ByVal numeroFila As Integer, ByVal backColor As Color)
            Try
                ' Referenciamos el objeto ListViewItem correspondiente
                ' a la fila indicada.
                '
                Dim item As ListViewItem = ListView1.Items(numeroFila)
                ' Indicamos que los subelementos no van a utilizar los valores de fuente,
                ' color de primer plano y color de fondo del elemento.
                '
                item.UseItemStyleForSubItems = False
                ' Mientras recorremos la colección de subelementos,
                ' establecemos su color de fondo.
                '
                For n As Integer = 0 To item.SubItems.Count - 1
                    item.SubItems(n).BackColor = backColor
                Next

            Catch ex As Exception
                Throw
            End Try
        End Sub
    Ahora, para colorear la primera fila, ejecutarías:
            Try
                SetBackColorSubItems(0, Color.Tomato)

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try
    Como los índices están en base cero, la primera fila es la número 0.
     
    Si te surgen nuevas preguntas sobre el comportamiento del control ListView, mejor será que inicies una nueva conversación. Y no englobes varias preguntas en el mismo mensaje, porque de esa manera obtendrás una respuesta mucho más rápida. ¿OK?
     
     

    Enrique Martínez [MS MVP - VB]
    martes, 10 de agosto de 2010 12:50
    Moderador

Todas las respuestas

  • "Ubuntu-Man" preguntó:

    > como hago, seleccionando algo en el formulario inicial, levanto
    > los datos desde el formulario emergente.

    Hola:

    "Levantar", no sé cómo vas a poder "levantar los datos". :-)

    Pero "mostrar los datos" del elemento del control ListView sobre el que se ha efectuado doble clic, es muy fácil.

    En el evento DoubleClick del control ListView, simplemente ejecutarías:

        Private Sub ListView1_DoubleClick( _
            ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles ListView1.DoubleClick

            ' Referenciamos la colección ListViewSubItemCollection del
            ' elemento sobre el que se ha efectuado el doble clic.
            '
            Dim subItemsCollection As ListViewItem.ListViewSubItemCollection = _
                ListView1.SelectedItems(0).SubItems

            ' Se lo pasamos al segundo formulario.
            '
            Dim frm As New Form2(subItemsCollection)

            frm.ShowDialog()

            frm.Dispose()

        End Sub

    Fíjate que creo la instancia del segundo formulario de la siguiente manera:

            Dim frm As New Form2(subItemsCollection)

    Eso significa que el constructor del formulario Form2, tiene que estar definido de la siguiente manera:

    Public Class Form2()

        Public Sub New(ByVal subItem As ListViewItem.ListViewSubItemCollection)


        End Sub

    End Class

    Esto es así para que puedas pasar objetos, controles, variables, etc., entre formularios.

    Ahora, vamos a imaginar que en el formulario Form2 tienes siete controles TextBox y dos controles CheckBox (para valores booleanos). Rellenarías los controles de la siguiente manera:

    Public Class Form2

        Private m_subItem As ListViewItem.ListViewSubItemCollection

        Public Sub New(ByVal subItem As ListViewItem.ListViewSubItemCollection)

            ' Llamada necesaria para el diseñador.
            InitializeComponent()

            ' Le asignamos el valor al campo del formulario.
            '
            m_subItem = subItem

            ' Rellenamos los valores de los distintos controles TextBox.
            '
            TextBox1.Text = m_subItem(0).Text
            TextBox2.Text = m_subItem(1).Text
            TextBox3.Text = m_subItem(2).Text
            TextBox4.Text = m_subItem(3).Text
            TextBox5.Text = m_subItem(4).Text
            TextBox6.Text = m_subItem(5).Text
            CheckBox1.Checked = CBool(m_subItem(6).Text)
            CheckBox2.Checked = CBool(m_subItem(7).Text)
            TextBox7.Text = m_subItem(8).Text

        End Sub

    End Class

    Y si por casualidad, deseas modificar la propiedad Text del elemento del control ListView pasado, con los valores existentes en los controles TextBox y CheckBox, puedes hacer uso del evento FormClosing del formulario Form2 para dicho propósito:

        Private Sub Form2_FormClosing( _
            ByVal sender As Object, _
            ByVal e As FormClosingEventArgs) Handles Me.FormClosing

            ' Se está cerrando el formulario; actualizamos
            ' el valor del objeto ListViewSubItemCollection.
            '
            m_subItem(0).Text = TextBox1.Text
            m_subItem(1).Text = TextBox2.Text
            m_subItem(2).Text = TextBox3.Text
            m_subItem(3).Text = TextBox4.Text
            m_subItem(4).Text = TextBox5.Text
            m_subItem(5).Text = TextBox6.Text
            m_subItem(6).Text = CStr(CheckBox1.Checked)
            m_subItem(7).Text = CStr(CheckBox2.Checked)
            m_subItem(8).Text = TextBox7.Text

        End Sub

    > Segundo tema. Tengo importes en tres columnas del listiview. Quisiera que al cargar
    > los datos en las columnas, poder ponerles un formato de moneda, o caso contrario
    > formato numerico con dos decimales. Ahora me carga por ejemplo: 32 cuando tendria
    > que ponerme 32.00 ó me carga 35.5 cuando me tendria que poner 35.50.

    Mira que os gusta hacer varias preguntas en la misma conversación. :-)

    Antes de llamar al método «Add» de la propiedad «SubItems» del objeto ListViewItem, tienes que FORMATEAR el valor tal cual deseas mostrarlo.

    Si solamente deseas mostrar el número con dos decimales, lo harías de la siguiente manera:

         Dim valor As String = String.Format("{0:N2}", 32)

         item.SubItems.Add(valor)

         valor = String.Format("{0:N2}", 35.5)

         item.SubItems.Add(valor)

    Se comprende que la variable objeto «item» referencia a un objeto ListViewItem, y que 32 y 35.5 son los valores que deseas formatear y añadirlos a la colección SubItems.

    > Si pudiera poner simbolo pesos mejor !!!.

    También puedes formatear el valor con el símbolo monetario que actualmente aparece en la configuración regional de tu sistema operativo. Para ello, en lugar de una N puedes especificar una C:

         valor = String.Format("{0:C2}", 35.5)

         item.SubItems.Add(valor)

    ¡Eso es todo!

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    sábado, 7 de agosto de 2010 6:45
    Moderador
  • MAESTRO !!!... Muchisimas gracias !!!

    A ver... y como puedo colorear una fila en particular del listview? Supongamos que una de las filas (o en varias) del listview existe un valor numerico que necesito destacar visualmente...

    Como puedo hacer?

    Saludos !!!

    martes, 10 de agosto de 2010 2:54
  • Ubuntu-Man" preguntó:
     
    > y como puedo colorear una fila en particular del listview?
     
    ¿Otra pregunta más? Pero, ¿por qué no inicias una nueva conversación para la nuevas preguntas que te surgan? :-)
     
    Una vez que referencies el objeto ListViewItem correspondiente a la fila que deseas colorear, tienes que establecer explícitamente el valor False a su propiedad UseItemStyleForSubItems, para indicar que los subelementos van a utilizar valores diferentes del elemento para la fuente, color de primer plano y color de fondo.
    Para ello te puede servir el siguiente procedimiento, al cual necesitarás pasar el número de fila (en base cero) y el color con el que deseas colorear la fila:
        Private Sub SetBackColorSubItems(ByVal numeroFila As Integer, ByVal backColor As Color)
            Try
                ' Referenciamos el objeto ListViewItem correspondiente
                ' a la fila indicada.
                '
                Dim item As ListViewItem = ListView1.Items(numeroFila)
                ' Indicamos que los subelementos no van a utilizar los valores de fuente,
                ' color de primer plano y color de fondo del elemento.
                '
                item.UseItemStyleForSubItems = False
                ' Mientras recorremos la colección de subelementos,
                ' establecemos su color de fondo.
                '
                For n As Integer = 0 To item.SubItems.Count - 1
                    item.SubItems(n).BackColor = backColor
                Next

            Catch ex As Exception
                Throw
            End Try
        End Sub
    Ahora, para colorear la primera fila, ejecutarías:
            Try
                SetBackColorSubItems(0, Color.Tomato)

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try
    Como los índices están en base cero, la primera fila es la número 0.
     
    Si te surgen nuevas preguntas sobre el comportamiento del control ListView, mejor será que inicies una nueva conversación. Y no englobes varias preguntas en el mismo mensaje, porque de esa manera obtendrás una respuesta mucho más rápida. ¿OK?
     
     

    Enrique Martínez [MS MVP - VB]
    martes, 10 de agosto de 2010 12:50
    Moderador
  • MAESTRO!!! ME ENCANTO!!! un abrazo grande y gracias
    jueves, 12 de agosto de 2010 17:09