No existe la propiedad ItemData de los controles ListBox y ComboBox

Síntomas

Puede observar los síntomas siguientes:
  • Al actualizar un proyecto de Microsoft Visual Basic 6.0 a Visual Basic .NET o Visual Basic 2005, los datos que se muestran en la ventana de propiedades para la propiedad ItemData se descartan.
  • En Visual Basic 6.0, puede establecer la propiedad ItemData de un ListBox o un control ComboBox en tiempo de diseño mediante la ventana Propiedades. En Visual Basic .NET o en Visual Basic 2005, la propiedad ItemData ya no existe para estos controles.

Solución

Para resolver este problema, utilice uno de los métodos siguientes:
  • Si actualiza un proyecto de Visual Basic 6.0 a Visual Basic .NET o Visual Basic 2005, utilice el VB6. SetItemData método (desde la biblioteca de compatibilidad de Visual Basic 6.0) para rellenar la lista. Normalmente se llama a este método en el constructor del formulario (el procedimiento Public Sub New ).
  • Para un nuevo proyecto de Visual Basic .NET o Visual Basic 2005, utilice una clase para contener los elementos de la lista. Para obtener más información, consulte la sección "Más información".

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

Generar un ejemplo de Visual Basic 6.0 para la actualización

  1. Cree un nuevo proyecto EXE estándar en Visual Basic 6.0. Se creará Form1 de forma predeterminada.
  2. Agregue un control ListBox y un control Label a Form1.
  3. Seleccione el control ListBox . En la ventana de propiedades del control ListBox , haga clic en Listay, a continuación, agregue los siguientes elementos. Presione la combinación de teclas CTRL + INTRO para desplazarse hasta el siguiente elemento.
         Carol Philips
    Jim Kim
    Jossef Goldberg
    Patricia Doyle

  4. Haga clic en la propiedad ItemData del control ListBox y, a continuación, agregue los valores siguientes:
         1001
    1002
    1004
    1005

  5. (Ratón) en Form1y, a continuación, haga clic en Ver código. Agregue el código siguiente en el procedimiento de evento Click del control ListBox :
    Private Sub List1_Click()Dim Msg As String
    'Add the employee number and the employee name.
    Msg = List1.ItemData(List1.ListIndex) & " "
    Msg = Msg & List1.List(List1.ListIndex)
    Label1.Caption = Msg
    End Sub

  6. Guardar el proyecto.
  7. En el menú Ejecutar , haga clic en Iniciar para ejecutar el proyecto. Asegúrese de que el proyecto se ejecuta sin errores.
  8. Guardar los cambios y, a continuación, cierre el entorno de Visual Basic.

Actualizar el proyecto de Visual Basic 6.0 a Visual Basic .NET o Visual Basic 2005

  1. Inicie Microsoft Visual Studio .NET o Microsoft Visual Basic 2005.
  2. En el menú proyecto , elija archivoy, a continuación, haga clic en Abrir. Seleccione el archivo .vbp que guardó en la sección anterior y, a continuación, haga clic en Aceptar.
  3. Siga las instrucciones en pantalla para actualizar el proyecto.
  4. Una vez finalizada la actualización, vaya a la ventana código de Form1. Si la ventana código no está disponible, haga clic en Form1 en el Explorador de soluciones y, a continuación, haga clic en Ver código.

    Observe que el código de procedimiento de evento haga clic en la aplicación de Visual Basic 6.0 se convierte en el evento SelectedIndexChanged del control ListBox en Visual Basic .NET o Visual Basic 2005. El código que recupera la información de ItemData ahora aparece como sigue (o similar):
    'UPGRADE_WARNING: Event List1.SelectedIndexChanged may fire when form is initialized. 'Click for more: ms-help://MS.VSCC/commoner/redir/redirect.htm?keyword="vbup2075"'
    Private Sub List1_SelectedIndexChanged(ByVal eventSender As _
    System.Object, ByVal eventArgs As System.EventArgs) Handles _
    List1.SelectedIndexChanged
    Dim Msg As String
    'Add the employee number and the employee name.
    Msg = VB6.GetItemData(List1, List1.SelectedIndex) & " "
    Msg = Msg & VB6.GetItemString(List1, List1.SelectedIndex)
    Label1.Text = Msg
    End Sub

    Nota: Este código requiere cambios. Sin embargo, puede reemplazar el VB6. GetItemString método con la sintaxis de Visual Basic .NET o Visual Basic 2005 como sigue:
    Msg = Msg & List1.Items(List1.SelectedIndex).ToString
  5. Antes de ejecutar esta aplicación, debe utilizar el método SetItemData agregar ItemData. Para ello, haga clic para expandir el código generado por el Diseñador de Windows Formsy, a continuación, haga clic para expandir el método Public Sub New si aún no se muestra.
  6. Agregue el código siguiente después de la instrucción InitializeComponent en el procedimiento Sub New :
    VB6.SetItemData(List1, 0, 1001)VB6.SetItemData(List1, 1, 1002)
    VB6.SetItemData(List1, 2, 1004)
    VB6.SetItemData(List1, 3, 1005)

  7. Guardar el proyecto. En el menú Depurar , haga clic en Iniciar para ejecutar el proyecto.
  8. Haga clic en cualquier elemento del cuadro de lista. Observe que la propiedad ItemData del control ListBox aparece con el Nombre del empleado en el control Label .

    Nota: Si ha agregado ItemData y ListItems mediante programación, en el proyecto de Visual Basic 6.0, el proyecto actualizado de Visual Basic .NET utiliza la siguiente sintaxis para llenar ListItems con ItemData del procedimiento Form_Load :
         List1.Items.Add(New VB6.ListBoxItem("Carol Philips", 1001))

Crear un proyecto nuevo en Visual Basic .NET o Visual Basic 2005

  1. Cree un nuevo proyecto de aplicación para Windows de Visual Basic. NET. Se agregará Form1 al proyecto de forma predeterminada.

    Nota: Debe cambiar el código en Visual Basic 2005. De forma predeterminada, Visual Basic crea dos archivos para el proyecto cuando se crea un proyecto de formularios Windows Forms. Si el formulario se denomina Form1, los dos archivos que lo representan se denominan Form1.vb y Form1.Designer.vb. Usted escribe el código en el archivo Form1.vb. El Diseñador de Windows Forms escribe el código en el archivo Form1.Designer.vb. El Diseñador de Windows Forms utiliza la palabra clave partial para dividir la implementación de Form1 en dos archivos independientes. Este comportamiento evita que el código generado por el diseñador se mezcle con el código.

    Para obtener más información acerca de las nuevas mejoras del lenguaje Visual Basic 2005, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

    Para obtener más información sobre las clases parciales y el Diseñador de Windows Forms, visite el siguiente sitio Web de MSDN:

  2. Coloque un cuadro combinado y un control Label en Form1.
  3. En el Explorador de soluciones, haga clic en el nombre del proyecto, elija Agregary, a continuación, haga clic en Agregar clase. Asegúrese de que la clase de Visual Basic está resaltada.

    Nota: En Visual Basic 2005, haga clic en el nombre de proyecto, elija Agregary, a continuación, haga clic en clase.
  4. Cambiar el nombre de la clase MyList.vby, a continuación, haga clic en Aceptar.
  5. Agregue el código siguiente a la sección Pública MyList de clase en la ventana de código de la clase MyList :
        Private sName As String    Private iID As Integer   'You can also declare this as String.

    Public Sub New()
    sName = ""
    iID = 0
    End Sub

    Public Sub New(ByVal Name As String, ByVal ID As Integer)
    sName = Name
    iID = ID
    End Sub

    Public Property Name() As String
    Get
    Return sName
    End Get

    Set(ByVal sValue As String)
    sName = sValue
    End Set
    End Property

    Public Property ItemData() As Integer
    Get
    Return iID
    End Get

    Set(ByVal iValue As Integer)
    iID = iValue
    End Set
    End Property

    Public Overrides Function ToString() As String
    Return sName
    End Function

  6. En el Explorador de soluciones, haga doble clic en Form1.vb para abrir la ventana de diseño de Form1.
  7. Haga doble clic en el formulario para ir al procedimiento Form1_Load y, a continuación, agregue el código siguiente al procedimiento Form1_Load :
            With ComboBox1            .Items.Add(New MyList("Carol Philips", 101))
    .Items.Add(New MyList("Jim Kim", 102))
    .Items.Add(New MyList("Jossef Goldberg", 103))
    .Items.Add(New MyList("Patricia Doyle", 104))
    .SelectedIndex = 0 'Set first item as selected item.
    End With

  8. En el Explorador de soluciones, haga doble clic en Form1.vb para abrir la ventana de diseño de Form1.
  9. Haga doble clic en el control ComboBox1 y, a continuación, agregue el código siguiente al procedimiento ComboBox1_SelectedIndexChanged :
            Dim mList As MyList        mList = ComboBox1.Items(ComboBox1.SelectedIndex)
    'In the following statement, you can either use mList.ToString or
    'mList.Name. They both return the Name property.
    Label1.Text = mList.ItemData & " " & mList.Name
    'Alternately, you can use the following syntax.
    'Label1.Text = ComboBox1.Items(ComboBox1.SelectedIndex).ItemData _
    ' & " " & ComboBox1.Items(ComboBox1.SelectedIndex).ToString

  10. Guardar el proyecto. En el menú Depurar , haga clic en Iniciar para ejecutar el proyecto.
  11. Seleccione cualquier elemento en el cuadro combinado. Observe que la propiedad ItemData del control ComboBox aparece con el Nombre del empleado en el control Label .
Nota: También puede utilizar una estructura en lugar de una clase de una manera similar. Para obtener más información acerca de cómo utilizar la clase frente a estructura en Visual Basic .NET o Visual Basic 2005, consulte la sección "Referencias".

Referencias

Para obtener más información acerca de cómo actualizar la propiedad ItemData de Visual Basic 6.0 a Visual Basic .NET o Visual Basic 2005, consulte el tema "no se puede actualizar la propiedad ItemData" en la documentación de Visual Studio .NET o la Ayuda en pantalla de Visual Basic 2005.

Para mejor comprender las diferencias entre una clase y una estructura, consulte el tema "Estructuras y clases" en la documentación de Visual Studio .NET o la Ayuda en pantalla de Visual Basic 2005.

Nota: El ejemplo de compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares y eventos mencionados son ficticios. Ninguna asociación con ninguna compañía real, organización, producto, nombre de dominio, dirección de correo electrónico, logotipo, persona, lugares o eventos se pretende ni debe deducirse.
Propiedades

Id. de artículo: 311340 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios