#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))
Вы должны в значительной степени всегда использовать привязку к данным, если это возможно.