elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Problemas con objeto y listbox en vs 2015
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con objeto y listbox en vs 2015  (Leído 658 veces)
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Problemas con objeto y listbox en vs 2015
« en: 22 Marzo 2019, 22:25 »

Saludos amigos, soy yo nuevamente molestando, tengo un problema con un listbox.

Verán, estoy haciendo una aplicación dónde esta cargue 3 rutas de un archivo sobre un objeto, posteriormente cuando ese objeto esté "relleno" lo inserto en un listbox, el problema se inicia cuando quiero obtener el valor de ese listbox el cuál según el vs el valor es nothing pero curiosamente a la hora de depurarlo los valores me dice que se ha rellenado correctamente.

Este es el código del objeto

Código
  1.  
  2.  
  3. Public Class Archivos
  4.  
  5.    'Atributos de la clase
  6.    Private str_ruta_archivo_entradas As String = String.Empty
  7.    Private str_ruta_archivo_valorizado As String = String.Empty
  8.    Private str_ruta_archivo_salidas As String = String.Empty
  9.    Private str_entradas_salidas_excluir As ArrayList
  10.  
  11.    'Métodos de acceso
  12.  
  13.    Public Property Str_Ruta_Archivo_E() As String
  14.        Get
  15.            Return Me.str_ruta_archivo_entradas
  16.  
  17.        End Get
  18.        Set(ByVal Value As String)
  19.            Me.str_ruta_archivo_entradas = Value
  20.        End Set
  21.    End Property
  22.  
  23.    Public Property Str_Ruta_Archivo_Val As String
  24.        Get
  25.            Return Me.str_ruta_archivo_valorizado
  26.        End Get
  27.        Set(ByVal Value As String)
  28.            Me.str_ruta_archivo_valorizado = Value
  29.        End Set
  30.    End Property
  31.  
  32.    Public Property Str_Salidas As String
  33.        Get
  34.            Return Me.str_ruta_archivo_salidas
  35.        End Get
  36.        Set(ByVal Value As String)
  37.            Me.str_ruta_archivo_salidas = Value
  38.        End Set
  39.    End Property
  40.  
  41.  
  42.    Public Property Str_ES_Excluir As ArrayList
  43.        Get
  44.            Return Me.str_entradas_salidas_excluir
  45.        End Get
  46.        Set(ByVal Value As ArrayList)
  47.            Me.str_entradas_salidas_excluir = Value
  48.        End Set
  49.    End Property
  50.  
  51.    'Constructor
  52.    Public Sub New(ByVal str_ruta_e As String, ByVal str_ruta_archivo_val As String, ByVal str_rutas_array As ArrayList, ByVal str_archivo_salidas As String)
  53.  
  54.        str_ruta_archivo_entradas = str_ruta_e
  55.        str_ruta_archivo_salidas = str_archivo_salidas
  56.        str_ruta_archivo_valorizado = str_ruta_archivo_val
  57.        str_entradas_salidas_excluir = str_rutas_array
  58.    End Sub
  59.  
  60.  
  61.    Public Sub New()
  62.  
  63.        str_ruta_archivo_entradas = String.Empty
  64.        str_ruta_archivo_valorizado = String.Empty
  65.        str_ruta_archivo_salidas = String.Empty
  66.        str_entradas_salidas_excluir = Nothing
  67.    End Sub
  68.  
  69. End Class
  70.  
  71.  


Aquí es dónde lo inserto mediante unos diálogos y un botón.

Código
  1.  
  2.  Try
  3.  
  4.  
  5.            Dim operaciones As Archivos
  6.            Dim str_ruta_archivo_E As String = String.Empty
  7.            Dim str_ruta_archivo_S As String = String.Empty
  8.            Dim str_ruta_archivo_Inv As String = String.Empty
  9.            Dim obj_array As New ArrayList
  10.            Dim int_cont As Integer = 0
  11.  
  12.  
  13.            'Cargando archivo de entradas/salidas
  14.  
  15.  
  16.            dlg_Abrir.Title = "Seleccione el archivo de excel (archivo de entradas) a procesar"
  17.            dlg_Abrir.DefaultExt = ".xlsx"
  18.  
  19.            lbl_estado.Text = "Cargando datos del archivo de entradas..."
  20.  
  21.  
  22.            If dlg_Abrir.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
  23.  
  24.                str_ruta_archivo_E = dlg_Abrir.FileName()
  25.            End If
  26.  
  27.  
  28.            'Cargando archivo de salidas
  29.  
  30.  
  31.            dlg_Abrir.Title = "Seleccione el archivo de excel (archivo de salidas) a procesar"
  32.            dlg_Abrir.DefaultExt = ".xlsx"
  33.  
  34.            lbl_estado.Text = "Cargando datos del archivo de salidas..."
  35.  
  36.  
  37.            If dlg_Abrir.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
  38.  
  39.                str_ruta_archivo_S = dlg_Abrir.FileName()
  40.  
  41.            End If
  42.  
  43.  
  44.            'Cargando archivo valorizado
  45.  
  46.  
  47.            dlg_Abrir.Title = "Seleccione el archivo de excel (archivo valorizado correspondiente a esas entradas/salidas) a procesar"
  48.            dlg_Abrir.DefaultExt = ".xlsx"
  49.  
  50.            lbl_estado.Text = "Cargando datos del archivo valorizado correspondiente a esas entradas/salidas..."
  51.  
  52.  
  53.            If dlg_Abrir.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
  54.  
  55.                str_ruta_archivo_Inv = dlg_Abrir.FileName()
  56.  
  57.            End If
  58.  
  59.  
  60.  
  61.            For Each valor In lt_salidas_entradas_excluir.Items
  62.  
  63.                obj_array.Add(valor)
  64.            Next
  65.  
  66.  
  67.            operaciones = New Archivos(str_ruta_archivo_E, str_ruta_archivo_Inv, obj_array, str_ruta_archivo_S)
  68.            lt_Archivos.Items.Add(operaciones)
  69.  
  70.  
  71.        Catch ex As Exception
  72.            MsgBox("Hubo un error cargando el archivo del contenedor.")
  73.        End Try
  74.  
  75.  



Mediante un menústrip de un contextmenú o menú contextual genero un pequeño dialogo y lo que hago es que quiero mostrar la información de ese objeto (que por cierto sería genial si alguno de uds sabe como ponerle texto más "bonito" a ese objeto en ese listbox sin alterar su valor como un combobox con sus propiedades de display member).



Código
  1.  
  2.  
  3. Private Sub MostrarInformaciónToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MostrarInformaciónToolStripMenuItem.Click
  4.  
  5.  
  6.        Dim obj As Archivos
  7.  
  8.  
  9.        obj = lt_Archivos.SelectedValue
  10.       MsgBox(obj.Str_Ruta_Archivo_E)
  11.  
  12.  
  13.  
  14.    End Sub
  15.  
  16.  


Curiosamente cuando lo depuro cómo les menciono arriba me dice que el objeto está correctamente insertado y tiene un valor pero a la hora de "jalarlo" no me sale nada, me preocupa porque necesito manipular ese objeto para el resto del proyecto, si uds saben algo se los agradecería demasiado.






En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problemas con objeto y listbox en vs 2015
« Respuesta #1 en: 23 Marzo 2019, 21:38 »

Ya pude, lo dejo para que otros si tienen la duda puedan resolverlo...


Código
  1.  
  2.    Dim obj As Archivos
  3.    obj = CType(lt_Archivos.SelectedItem, Archivos)
  4.  
  5.  

Y ya con la variable "obj" pueden jugar.


Ahora bien, lo que no he podido hacer aún es lo siguiente:

Quiero que cuando se inserte ese objeto en lugar de decir el nombre del objeto diga "Archivo1,Archivo2", lo que hice fue cambiar el método toString para que diga archivo pero quiero tener un contador para así el usuario pueda diferenciar entre los objetos del listbox.

Lo que hice fue esto:

Código
  1.  
  2.  
  3. Public Overrides Function ToString() As String
  4.  
  5.        Return str_mostrar_texto & int_cont
  6.  
  7.    End Function
  8.  
  9. End Class
  10.  
  11.  


Lógicamente agregué el atributo "str_mostrar_texto" en la clase así como sus gets y sets.


Entonces no se si alguno tendrá alguna sugerencia? ya lo intenté con un integer global pero no suma el contador y en todas da 0.

Muchas gracias desde ya.


En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Problemas con objeto y listbox en vs 2015
« Respuesta #2 en: 24 Marzo 2019, 13:51 »

Carece de sentido que en el diseño de la clase "Archivos" implementes un contador de ningún tipo, ya que si no te he entendido mal, la clase archivos se supone que sirve para representar una serie de rutas de archivos que están relacionados entre si, pues bien, eso es correcto, pero en ese caso eso sería todo lo que debes hacer con esa clase...

Así que deberías dar el diseño de esa clase por finalizado, y a partir de ahí eres tú el que debe declarar un contador (fuera de la clase "Archivos") y añadir/mostrar ese contador al añadir cada uno de esos items al ListBox, no al revés, es decir, no debe ser la clase "Archivos" la que deba representar por si misma y mostrar un índice al ser representado como texto ( Archivos.ToString() ) en un control, eso es mezclar cosas que no tienen nada que ver, y por ende no tiene sentido productivo. No se si me he explicado suficientemente bien.

De todas formas no tengo muy claro por que sientes la necesidad de usar una variable-contador que actue como índice de los items representados en el listbox, es decir, el índice del elemento lo puedes obtener directamente en la lista de elementos de dicho ListBox y mostrarlo si quieres junto al nombre del elemento, algo como por ejemplo:

Código
  1. Me.ListBox1.BeginUpdate()
  2. For i As Integer = 0 To (Me.ListBox1.Items.Count - 1)
  3.    Me.ListBox1.Items(i) = String.Format("[{0:00}] {1}", i, Me.ListBox1.Items(i))
  4. Next
  5. Me.ListBox1.EndUpdate()

...o en su defecto siempre puedes añadir las instancias de la clase "Archivos" a un diccionario u otra colección apropiada para tus necesidades, en la que usar la "llave" como índice, y luego mostrarlo al añadir el valor/elemento en el listbox.

Pero en fin. Dices que ya lo intentaste con un "integer global" (imagino que te refieres a que usaste el modificador de visibilidad Public Shared) pero "no suma el contador y en todas da 0". Todo esto no se entiende mucho. Para empezar, no se sabe donde lo declaraste, ni cuando y como incrementas su valor, pero algo parece evidente, y es que si su valor siempre es 0, será que la unidad de código donde incrementas el valor nunca se llega a ejecutar, o si se ejecuta pero en realidad no llegas a incrementar el valor. No se pueden sacar otras conclusiones mientras no aportes más información.

Saludos.
« Última modificación: 24 Marzo 2019, 13:55 por Eleкtro » En línea


Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problemas con objeto y listbox en vs 2015
« Respuesta #3 en: 24 Marzo 2019, 19:51 »

Muchas gracias elektro por responder, siempre con mucho conocimiento por dar y aprendo mucho de tu persona.

Mira, lo único que quiero que cuando agregue ese objeto al listbox no aparezca como texto en cada item el valor del objeto, es decir NO quiero que aparezca como "nombredel proyecto.objeto" sino que en ese texto aparezca como archivo1, archivo2,archivo3 sin alterar lógicamente sus atributos.


La variable local la declaré tanto en la clase del form dónde estaba ese listbox como erroneamente tambien en ese objeto.

Lo intenté con el método toString() para en lugar de "nombredelproyecto.objeto" se mostrara Archivo pero queria concatenarle un contador que se fuera incrementando, pero no lo logré.

En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problemas con objeto y listbox en vs 2015
« Respuesta #4 en: 26 Marzo 2019, 17:28 »

Luego de un montón de intentos lo logré!!  ;-).


En el método del constructor del objeto archivo lo agregué cómo parámetro:

Código
  1.  
  2.  
  3. Public Sub New(ByVal str_ruta_e As String, ByVal str_ruta_archivo_val As String, ByVal str_rutas_array As ArrayList, ByVal str_archivo_salidas As String, ByVal int_cont As Integer)
  4.  
  5.        str_ruta_archivo_entradas = str_ruta_e
  6.        str_ruta_archivo_salidas = str_archivo_salidas
  7.        str_ruta_archivo_valorizado = str_ruta_archivo_val
  8.        str_entradas_salidas_excluir = str_rutas_array
  9.        int_contador = int_cont
  10.    End Sub
  11.  
  12.  


Posteriormente en el form, declaré la variable como pública:

Código
  1.  
  2. Public int_contador
  3.  
  4.  


Modifiqué el método para que tuviera como parámetro la variable:

Código
  1.  
  2.  
  3. Private Sub cargar_archivos(ByVal int_cont As Integer)
  4. ..
  5. end sub
  6.  
  7.  


LLamé al método en el botón:


Código
  1.  
  2. Private Sub btn_Cargar_Archivos_Click(sender As Object, e As EventArgs) Handles btn_Cargar_Archivos.Click
  3.  
  4.        int_contador = int_contador + 1
  5.        cargar_archivos(int_contador)
  6.  
  7.  
  8.  


Agregándolo finalmente así al listbox:

Código
  1.  
  2. lt_Archivos.Items.Add(New Archivos(str_ruta_archivo_E, str_ruta_archivo_Inv, obj_array, str_ruta_archivo_S, int_cont))
  3.  
  4.  
  5.  

Gracias por leerme.
En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Problemas con objeto y listbox en vs 2015
« Respuesta #5 en: 26 Marzo 2019, 19:55 »

Primero que nada, y disculpa que te lo diga pero es que realmene se me hace horrible ver tanto guión bajo junto. No se como tú te entiendes con eso, pero a mi se me hace muy dificil/tedioso la lectura de tanto guión bajo.

El caso es que no estás siguiendo las convenciones de nomenclaturas recomendadas para la programación .NET, y sin entrar mucho en detalle te puedo decir que basicamente consiste en usar Camel case para casi todos los tipos de miembros indiferentemente de su modificador de visibilidad (excepto algunos casos, pero ya dije que sin entrar en muchos detalles).

Aparte de eso, yo en tu lugar sellaría la clase Archivos, quitaría la asignación de un valor inicial (innecesario) en los campos str_*, y los constructores los dejaría así:

Código
  1. Public NotInheritable Class Archivos
  2.  
  3.    Private str_ruta_archivo_entradas As String
  4.    Private str_ruta_archivo_valorizado As String
  5.    Private str_ruta_archivo_salidas As String
  6.    Private str_entradas_salidas_excluir As ArrayList
  7.  
  8.    '...
  9.  
  10.    Public Sub New()
  11.        ' Esta llamada es completamente opcional y solo lo muestro para proveer mayor flexibilidad de código (al poder especificar un valor inicial).
  12.        ' Me.New(String.Empty, String.Empty, Nothing, String.Empty)
  13.    End Sub
  14.  
  15.    Public Sub New(ByVal str_ruta_e As String, ByVal str_ruta_archivo_val As String, ByVal str_rutas_array As ArrayList, ByVal str_archivo_salidas As String)
  16.        str_ruta_archivo_entradas = str_ruta_e
  17.        str_ruta_archivo_valorizado = str_ruta_archivo_val
  18.        str_entradas_salidas_excluir = str_rutas_array
  19.        str_ruta_archivo_salidas = str_archivo_salidas
  20.    End Sub
  21.  
  22. End Class

...eso suponiendo que realmente quieras declarar un constructor por defecto sin parámetros, de lo contrario:

Código
  1. ' ...
  2. Private Sub New()
  3. End Sub
  4.  
  5. Public Sub New(ByVal str_ruta_e As String, ByVal str_ruta_archivo_val As String, ByVal str_rutas_array As ArrayList, ByVal str_archivo_salidas As String)
  6.    str_ruta_archivo_entradas = str_ruta_e
  7.    str_ruta_archivo_valorizado = str_ruta_archivo_val
  8.    str_entradas_salidas_excluir = str_rutas_array
  9.    str_ruta_archivo_salidas = str_archivo_salidas
  10. End Sub
  11. ' ...

Es más, esas 70 lineas que ocupa la clase Archivos lo puedes simplificar a 15 o 20 lineas declarando auto-propiedades, en lugar de declarar propiedades con su getter y setter y su campo de apoyo o backing field, resulta innecesario en ese diseño de clase Archivos, pero bueno, eso no te lo he mostrado por que ahora mismo no recuerdo si fue a partir de Visual Studio 2015 / VB.NET 14.0 o cuando se implementó esta característica, o fue a partir de Visual Studio 2017 / VB.NET 15.



Curiosamente cuando lo depuro cómo les menciono arriba me dice que el objeto está correctamente insertado y tiene un valor pero a la hora de "jalarlo" no me sale nada, me preocupa porque necesito manipular ese objeto para el resto del proyecto, si uds saben algo se los agradecería demasiado.

Debes usar la propiedad ListBox.SelectedItem en vez de ListBox.SelectedValue, ya que no especificaste ningún miembro para la propiedad ListBox.ValueMember, normal que te salte una excepción de referencia nula...

Te muestro un ejemplo reducido:
Código
  1. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
  2.    Dim test As New Archivos("test", "test", New ArrayList(), "test")
  3.    ListBox1.Items.Add(test)
  4. End Sub
  5.  
  6. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
  7.    Dim test As Archivos = DirectCast(Me.ListBox1.SelectedItem, Archivos)
  8.    MsgBox(test .ToString)
  9. End Sub

Saludos
« Última modificación: 26 Marzo 2019, 20:33 por Eleкtro » En línea


Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problemas con objeto y listbox en vs 2015
« Respuesta #6 en: 27 Marzo 2019, 15:35 »

Gracias elektro, tomaré en cuenta las recomendaciones, y no, no uso 2017, no lo tengo, el que estoy usando es el 2015.
En línea

Nunca me contestan -_-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines