как показать строку списка в другом списке

#vb.net

#vb.net

Вопрос:

 Public Class frmAppliances
    Private Sub frmAppliances_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        lstApp.Items.Add(New Product("Electric fan", 500.0))
        lstApp.Items.Add(New Product("Refrigerator", 9000.0))
        lstApp.Items.Add(New Product("Washing Machine", 4000.0))
        lstApp.Items.Add(New Product("Oven Toaster", 550.0))
        lstApp.Items.Add(New Product("Flat Iron", 350.0))
        lstApp.Items.Add(New Product("VCD Player", 1200.0))
        lstApp.Items.Add(New Product("Mini Component", 3500.0))
        lstApp.Items.Add(New Product("Television", 5000.0))
        lstApp.Items.Add(New Product("Air Conditioner", 10000.0))
        lstApp.Items.Add(New Product("Rice Cooker", 600.0))
        lstApp.Items.Add(New Product("Electric Stove", 1000.0))
        lstApp.Items.Add(New Product("Electric Pot", 800.0))
        lstApp.Items.Add(New Product("Karaoke", 2500.0))
        lstApp.Items.Add(New Product("Microwave Oven", 3000.0))
    End Sub

    Private Sub lstApp_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstApp.SelectedIndexChanged
        Dim prc As Double = CType(lstApp.SelectedItem, Product).Price
        lstPrice.Items.Add(prc)
        Dim parts As String = lstApp.Items.ToString()
        lstSold.Items.Add(parts)

    End Sub

    Public Class Product
        Public Name As String
        Public Price As Double

        Public Sub New(ByVal pName As String, ByVal pPrice As Double)
            Name = pName
            Price = pPrice
        End Sub

        Public Overrides Function ToString() As String
            Return Name
        End Function
    End Class
 

В списке, который я хочу показать, указано возражение формы системы Windows, другое поле списка указано по цене.

Комментарии:

1. «В списке указано возражение формы системы Windows» . Нет, это не так. В этом случае мы можем определить, что он на самом деле говорит, но это может быть не всегда так, поэтому, пожалуйста, предоставьте фактическую информацию, а не расплывчатое приближение.

Ответ №1:

Проблема здесь:

 Dim parts As String = lstApp.Items.ToString()
 

Items Свойство представляет собой коллекцию всех элементов в ListBox так почему вы думаете, что отображение String представления этого было бы полезно здесь? Как и подавляющее большинство типов, его ToString метод просто возвращает имя типа. Вы уже знаете, как получить значение из выбранного элемента, потому что вы выполняете iit для the Price , так почему вы думаете, что выполнение этого для the Name будет каким-то другим?

 Dim selectedProduct = DirectCast(lstApp.SelectedItem, Product)
Dim price = selectedProduct.Price
Dim name = selectedProduct.Name
lstPrice.Items.Add(price)
lstSold.Items.Add(name)
 

Тем не менее, вы делаете это совершенно неправильно. Во-первых, вы должны почти ВСЕГДА использовать свойства, а не поле:

 Public Class Product
    Public Property Name As String
    Public Property Price As Double

    Public Sub New(name As String, price As Double)
        Me.Name = name
        me.Price = price
    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class
 

Далее вы должны создать список Product объектов и привязать его к элементу управления:

 
Dim products = {New Product("Electric fan", 500.0),
                New Product("Refrigerator", 9000.0),
                New Product("Washing Machine", 4000.0),
                New Product("Oven Toaster", 550.0),
                New Product("Flat Iron", 350.0),
                New Product("VCD Player", 1200.0),
                New Product("Mini Component", 3500.0),
                New Product("Television", 5000.0),
                New Product("Air Conditioner", 10000.0),
                New Product("Rice Cooker", 600.0))
                New Product("Electric Stove", 1000.0),
                New Product("Electric Pot", 800.0),
                New Product("Karaoke", 2500.0),
                New Product("Microwave Oven", 3000.0)}

With lstApp
    .DisplayMember = "Name"
    .ValueMember = "Price"
    .DataSource = products
End With
 

Обратите внимание, что для привязки данных требуются свойства. Наконец, вы можете получить Name и Price из выбранного Product следующим образом:

 lstSold.Items.Add(lstApp.Text)
lstPrice.Items.Add(CDbl(lstApp.SelectedValue))
 

Вы должны в значительной степени всегда использовать привязку к данным, если это возможно.