Foros del Web » Programación para mayores de 30 ;) » .NET »

problemilla con listview

Estas en el tema de problemilla con listview en el foro de .NET en Foros del Web. Buenas! Tengo un problemilla con un listview que no me acaba de mostrar los datos como yo quiero :S os pongo el código antes de ...
  #1 (permalink)  
Antiguo 20/02/2010, 11:51
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
problemilla con listview

Buenas!

Tengo un problemilla con un listview que no me acaba de mostrar los datos como yo quiero :S

os pongo el código antes de nada:

Código vb:
Ver original
  1. '%%%%%%%%%%%%%%%%%%%%%
  2.        'Relleno el ListView de medidas
  3.        'llenamos el ListView con las medidas
  4.        '%%%%%%%%%%%%%%%%%%%%%
  5.  
  6.         ' Propiedades del ListView  
  7.        With lvInicioMedidas
  8.             .Items.Clear()
  9.             .Columns.Clear()
  10.             .View = View.Details
  11.             .GridLines = True
  12.             .FullRowSelect = True
  13.             ' añadir los nombres de columnas  
  14.            For c As Integer = 2 To TablaMedidas.Columns.Count - 1
  15.                 .Columns.Add(TablaMedidas.Columns(c).Caption)
  16.             Next
  17.         End With
  18.  
  19.         ' Añadir los registros de la tabla  
  20.        ' La TablaMedidas empieza por 0 la numeración de ítems (SQLite)
  21.        ' El ListView empieza por 1 la numeración de ítems (VB .net)
  22.        With TablaMedidas
  23.             'recorrer filas en TablaMedidas
  24.            For f As Integer = 0 To .Rows.Count - 1
  25.  
  26.                 'fila de items que agrego al ListView
  27.                Dim fila As New ListViewItem '(TablaMedidas.Rows(f).Item(2).ToString)
  28.  
  29.                 ' recorrer las columnas en TablaMedidas (a partir de la segunda) para construir cada fila
  30.                For c As Integer = 2 To .Columns.Count - 1
  31.                     If c = 2 Then 'si es una fecha (columna 2)
  32.                        Dim fechaMedida As Date = TablaMedidas.Rows(f).Item(c).Date
  33.                         fila.SubItems.Add(fechaMedida)
  34.                     ElseIf c > 2 Then 'si es una medida (resto de columnas)
  35.                        Dim medidas As Single = TablaMedidas.Rows(f).Item(c).ToString()
  36.                         fila.SubItems.Add(medidas)
  37.                     End If
  38.                 Next
  39.                 'meto datos en el ListView
  40.                lvInicioMedidas.Items.Add(fila)
  41.             Next
  42.         End With

La situación en la siguiente:

Tengo una tabla TablaMedidas que contiene una consulta de la base de datos. En ella se incluyen varios campos:

id_medida, id_cliente, fecha, peso, lipocalibrador, cintura, etc (en total 15 columnas)

El caso es que en el ListView quiero mostrar una parte de esa tabla y no toda la tabla, en concreto quiero ocultar la id de la medida y la id del cliente. Es decir, solo quiero mostrar la fecha y las medidas correspondientes a esa fecha.

El caso es que tal y como lo tengo me muestra estos resultados:



Como veis me desplaza los datos una columna y no se porque. He probado de mil formas con el debugger, pero la verdad es que no veo el fallo. Lo que si que he visto es que el fallo podría estar en la línea

Código vb:
Ver original
  1. lvInicioMedidas.Items.Add(fila)

ya que con el debugger compruebo como se van metiendo los subitems correctamente en la variable fila (aunque realmente no puedo ver (o no se como) todo el contenido de fila)

Agradecería vuestra ayuda para solucionar este problema.

Saludos y gracias
  #2 (permalink)  
Antiguo 21/02/2010, 09:06
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: problemilla con listview

cucu! help!
  #3 (permalink)  
Antiguo 21/02/2010, 09:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemilla con listview

En realidad no hay ningún error: En un ListView, todos los elementos que contiene son tratados como String, y por tanto se ajustan a la izquierda.
Hay, de todos modos, una propiedad de la columna que es HorizontalAlignment, la cual puedes configurar para que se ajuste al centro o a la derecha. El único problema es que como es una propiedad de la columna, también hará que el título se ajuste de esa forma.

Una forma simple de configurar tus columnas es en el mismo diseño del listview, o si lo quieres hacer por código sería en esta parte:
Código vb.net:
Ver original
  1. For c As Integer = 2 To TablaMedidas.Columns.Count - 1
  2.             .Columns.Add(TablaMedidas.Columns(c).Caption, 70, HorizontalAlignment.Right)
  3. Next
Ahora bien: Para usar esta forma del método necesitas poner sí o sí el ancho (Width) de la columna. De allí ese "70" que aparece en segundo lugar.
En tu caso ponle el ancho que quieras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 21/02/2010, 10:05
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: problemilla con listview

gnzsoloyo, eres grande! jeje pero esta vez o no me he sabido explicar o no me has entendido bien jeje

He probado añadiendo tu código y no he podido solucionar el problema. Yo creo que el asunto esta en como se meten los datos en el listview, más que en la distribución de las columnas.

Vamos, que el problema creo que viene dado porque no añado correctamente al listview los elementos o algo por el estilo. Aquí:

Código vb:
Ver original
  1. fila.SubItems.Add(fechaMedida)

o bien aquí:

Código vb:
Ver original
  1. lvInicioMedidas.Items.Add(fila)

No se si es que entran desordenados o me los inserta directamente en la posición 2 en vez de en la 1, no se...

Raro raro

Al final lo que he hecho es esto:

Código vb:
Ver original
  1. '%%%%%%%%%%%%%%%%%%%%%
  2.        'Relleno el ListView de medidas
  3.        'llenamos el ListView con las medidas
  4.        '%%%%%%%%%%%%%%%%%%%%%
  5.  
  6.         ' Propiedades del ListView  
  7.        With lvInicioMedidas
  8.             .Items.Clear()
  9.             .Columns.Clear()
  10.             .View = View.Details
  11.             .GridLines = True
  12.             .FullRowSelect = True
  13.             ' añadir los nombres de columnas  
  14.            For c As Integer = 2 To TablaMedidas.Columns.Count - 1
  15.                 .Columns.Add(TablaMedidas.Columns(c).Caption, 70, HorizontalAlignment.Center)
  16.             Next
  17.         End With
  18.  
  19.         ' Añadir los registros de la tabla  
  20.        With TablaMedidas
  21.             For f As Integer = 0 To .Rows.Count - 1
  22.  
  23.                 Dim fila As New ListViewItem(TablaMedidas.Rows(f).Item(2).ToString)
  24.                 ' recorrer las columnas  
  25.                For c As Integer = 3 To .Columns.Count - 1
  26.  
  27.                     'If c = 3 Then 'si es una fecha (columna 2)
  28.                    '    Dim fechaMedida As Date = TablaMedidas.Rows(f).Item(c).Date
  29.                    '    fila.SubItems.Add(fechaMedida)
  30.                    'ElseIf c > 3 Then 'si es una medida (resto de columnas)
  31.                    '    Dim medidas As String = TablaMedidas.Rows(f).Item(c).ToString()
  32.                    '    fila.SubItems.Add(medidas)
  33.                    '    'fila.SubItems(c) = medidas
  34.                    'End If
  35.                    Dim medidas As String = TablaMedidas.Rows(f).Item(c).ToString()
  36.                     fila.SubItems.Add(medidas)
  37.  
  38.                 Next
  39.                 lvInicioMedidas.Items.Add(fila)
  40.             Next
  41.         End With

así me lo muestra bien, pero el problema que tengo es que la fecha me la muestra en el formato DD/MM/YYYY HH:HH:HH, cuando yo solo quiero DD/MM/YYYY... he probado cambiando a date aquí:

Código vb:
Ver original
  1. Dim fila As New ListViewItem(TablaMedidas.Rows(f).Item(2).ToString)

dejándolo así:

Código vb:
Ver original
  1. Dim fila As New ListViewItem(TablaMedidas.Rows(f).Item(2).Date)

Pero me da un error:

Código vb:
Ver original
  1. Error   1   Error de resolución de sobrecarga porque ninguna de las funciones 'New' a las que se tiene acceso se puede llamar sin una conversión de restricción:
  2.    'Public Sub New(group As System.Windows.Forms.ListViewGroup)': El parámetro 'group' correspondiente al argumento se reduce de 'Object' a 'System.Windows.Forms.ListViewGroup'.
  3.    'Public Sub New(items() As String)': El parámetro 'items' correspondiente al argumento se reduce de 'Object' a '1-matriz dimensional de String'.
  4.     'Public Sub New(text As String)': El parámetro 'text' correspondiente al argumento se reduce de 'Object' a 'String'.   C:\Users\*\Documents\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\WindowsApplication1.vb 256 21  WindowsApplication1

gracias por la respuesta en cualquier caso

EDITO:

Bueno, tocando, tocando... he dado con la solución:

Ahí va:

Código vb:
Ver original
  1. '%%%%%%%%%%%%%%%%%%%%%
  2.        'Relleno el ListView de medidas
  3.        'llenamos el ListView con las medidas
  4.        '%%%%%%%%%%%%%%%%%%%%%
  5.  
  6.         ' Propiedades del ListView  
  7.        With lvInicioMedidas
  8.             .Items.Clear()
  9.             .Columns.Clear()
  10.             .View = View.Details
  11.             .GridLines = True
  12.             .FullRowSelect = True
  13.             ' añadir los nombres de columnas  
  14.            For c As Integer = 2 To TablaMedidas.Columns.Count - 1
  15.                 .Columns.Add(TablaMedidas.Columns(c).Caption, 70, HorizontalAlignment.Center)
  16.             Next
  17.         End With
  18.  
  19.         ' Añadir los registros de la tabla  
  20.        With TablaMedidas
  21.             For f As Integer = 0 To .Rows.Count - 1
  22.                 'declaro la llamada a la columna uno
  23.                Dim col1 As String = TablaMedidas.Rows(f).Item(2).Date
  24.  
  25.                 Dim fila As New ListViewItem(col1)
  26.                 ' recorrer las columnas  
  27.                For c As Integer = 3 To .Columns.Count - 1
  28.  
  29.                     'If c = 3 Then 'si es una fecha (columna 2)
  30.                    '    Dim fechaMedida As Date = TablaMedidas.Rows(f).Item(c).Date
  31.                    '    fila.SubItems.Add(fechaMedida)
  32.                    'ElseIf c > 3 Then 'si es una medida (resto de columnas)
  33.                    '    Dim medidas As String = TablaMedidas.Rows(f).Item(c).ToString()
  34.                    '    fila.SubItems.Add(medidas)
  35.                    '    'fila.SubItems(c) = medidas
  36.                    'End If
  37.                    Dim medidas As String = TablaMedidas.Rows(f).Item(c).ToString()
  38.                     fila.SubItems.Add(medidas)
  39.  
  40.                 Next
  41.                 lvInicioMedidas.Items.Add(fila)
  42.             Next
  43.         End With

Saludos!

Última edición por AlterElt; 21/02/2010 a las 10:15
  #5 (permalink)  
Antiguo 21/02/2010, 11:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemilla con listview

Vamos a hacer una pequeña pulida.
Como te dije, todos los objetos que van en cada línea de un ListView son en realidad Strings, y como tales los tienes que poner.
Pero además, cuando creas el ListViewItem, en realidad estás creando también el primer Subitem. Los demás dependen de él. Por eso, que vuelvas a poner el SubItem(0) es redundante.
Por otra parte, el problema de formato de fecha es un tema de regionalización de la PC (administrado por el Namespace System.Globalization), y del tipo de dato usado. En mi experiencia, es mejor indicar el formato manualmente para evitar errores, por ello esto funcionaría bien:

Código vb.net:
Ver original
  1. '%%%%%%%%%%%%%%%%%%%%%
  2.         'Relleno el ListView de medidas
  3.         'llenamos el ListView con las medidas
  4.         '%%%%%%%%%%%%%%%%%%%%%
  5.  
  6.         ' Propiedades del ListView  
  7.         With lvInicioMedidas
  8.             .Items.Clear()
  9.             .Columns.Clear()
  10.             .View = View.Details
  11.             .GridLines = True
  12.             .FullRowSelect = True
  13.             ' añadir los nombres de columnas  
  14.             For c As Integer = 2 To TablaMedidas.Columns.Count - 1
  15.                 .Columns.Add(TablaMedidas.Columns(c).Caption, 70, HorizontalAlignment.Center)
  16.             Next
  17.         End With
  18.  
  19.         ' Añadir los registros de la tabla  
  20.         Dim fila As New ListViewItem()
  21.         Dim col1 As String
  22.         With TablaMedidas
  23.             For f As Integer = 0 To .Rows.Count - 1
  24.                 'declaro la llamada a la columna uno
  25.                 col1 = Convert.ToDateTime(TablaMedidas.Rows(f).Item(2)).ToString("dd/MM/yyyy")
  26.                 ' recorrer las columnas  
  27.                 fila = lvInicioMedidas.Items.Add(col1)
  28.                 For c As Integer = 1 To .Columns.Count - 1
  29.                     fila.SubItems.Add(TablaMedidas.Rows(f).Item(c).ToString())
  30.                  Next
  31.             Next
  32.         End With
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/02/2010 a las 11:32
  #6 (permalink)  
Antiguo 21/02/2010, 13:18
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: problemilla con listview

Cita:
Iniciado por gnzsoloyo Ver Mensaje
cuando creas el ListViewItem, en realidad estás creando también el primer Subitem. Los demás dependen de él. Por eso, que vuelvas a poner el SubItem(0) es redundante.
Esa era la clave que no sabía jeje

Etiquetas: listview
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:54.