无法找到任何帮助,Similar Questions
stackoverflow建议在写这个优惠时没有任何帮助。
我想在迭代For i = 0
循环的同时设置多个属性的值,同时在列表中分别使用Property和Value,我试图使用For循环的索引来执行此操作选择价值和财产。
我到目前为止所尝试的内容如下所示,虽然已针对此问题进行了细分,但它没有为属性设置任何值,只是将其存储在列表mPropList
本身中,我需要将值存储为属性(或bog标准变量,但我更喜欢Property(s))
Public Class IDC
Private mPropList As new List(Of Object)From {pID, pCat, pNum, pVer}
Private mFieldList as New List(Of String) From {"ID", "Cat", "Num", "Ver"}
Friend Property pID() As String
Get
Return mID
End Get
Set(value As String) 'Same setup for the other Properties
mID = value
End Set
End Property
...
Sub New()
For i = 0 To mFieldList.Count - 1
mPropList(i) = mFieldList(i)
Next
End Sub
End Class
如果我只想从mPropList
获取值,上述内容非常有用,但我需要从pID,pCat...
中获取值
Output:
List Values:
mPropList(0) = ID
mPropList(1) = Cat
mPropList(2) = Num
mPropList(3) = Ver
Property Values:
pID = Nothing
pCat = Nothing
pNum = Nothing
pVer = Nothing
我希望我已经正确解释了这一点,并没有将上面的代码减少到很多并打破它。我似乎无法找到对此的直接答案,并且不希望创建“另一个”类来管理它或创建更多代码。但如果另一个班级是唯一的方式,我想我别无选择。
但是如果上面的想法可以起作用我在我的代码中有其他几个地方我可以应用这个,所以手指交叉。
任何帮助都会很好。
编辑:使用New List(Of String) From {"ID", "Cat", "Num", "Ver"}
只是为了显示'可能'在列表中的值,实际上是由Access OLEDB Read填充的命令。
EDIT2:这更像是一个“可以做到”的好奇心,而不是“应该做什么”,因为我是新手,我正在尝试尝试并找到不同的做事方式学习...
答案 0 :(得分:0)
道歉如果我掌握了错误的结尾 - 你能不能使用idc类的集合,并使用for循环遍历它? (如果你想处理通知,可观察的收集(T))....
根据要求,快速(并且非常脏!)代码。不确定你是否想要它,但是这里......资源是我导入的现有类。
Imports System.Collections.ObjectModel
Imports Resource.Resource
Module Module1
Public collplay As New Collection(Of Resource.Resource)
Sub Main()
Dim tempres As New Resource.Resource
Dim tempres2 As New Resource.Resource
tempres.Name = "supaStix"
tempres.ShortName = "stix"
collplay.Add(tempres)
tempres2.Name = "FredBloggs"
tempres2.ShortName = "Bloggs"
collplay.Add(tempres2)
Dim reit As New Resource.Resource
For Each reit In collplay
Console.Write(reit.Name.ToString)
Next
End Sub
End Module
在每个循环中,Resource的每个属性都可用于您想要的任何Feed列表,无论如何都可以写入DB。
我并不完全确定我已经掌握了你想要做的事情,所以如果我正在咆哮错误的树那么道歉......
使用ObservableCollection的简单示例更新了29/04 .....
一个简单的Win Forms App。
Imports System.Collections.ObjectModel
Imports Resource.Resource
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim collres As New ObservableCollection(Of Resource.Resource)
For x = 1 To 4
Dim singleres As New Resource.Resource
singleres.ShortName = "Stix" & x.ToString
singleres.Name = "SupaStix" & x.ToString
collres.Add(singleres)
Next
DataGridView1.DataSource = collres
End Sub
End Class
来自MSDN: -
***在许多情况下,您使用的数据是对象的集合。例如,数据绑定中的常见方案是使用ItemsControl(如ListBox,ListView或TreeView)来显示记录集合。 您可以枚举实现IEnumerable接口的任何集合。但是,要设置动态绑定以便集合中的插入或删除自动更新UI,集合必须实现INotifyCollectionChanged接口。此接口公开CollectionChanged事件,该事件应在基础集合更改时引发。 WPF提供了ObservableCollection(Of T)类,它是实现INotifyCollectionChanged接口的数据集合的内置实现。 在实现您自己的集合之前,请考虑使用ObservableCollection(Of T)或现有集合类之一,例如List(Of T),Collection(Of T)和BindingList(Of T)等等。如果您有高级方案并且想要实现自己的集合,请考虑使用IList,它提供可以通过索引单独访问的非泛型对象集合。实现IList可以使用数据绑定引擎提供最佳性能。
要完全支持将数据值从绑定源对象传输到绑定目标,集合中支持可绑定属性的每个对象都必须实现适当的属性更改通知机制,例如INotifyPropertyChanged接口。***
答案 1 :(得分:0)
您希望通过属性列表访问IDC类的真实属性。正如Visual Vincent在评论中提到的,您可以使用属性访问器,即代理。创建一类属性访问器和属性名称。
Class PropertyAccessor
Public Sub New(name As String, getVal As Func(Of Object), setVal As Action(Of Object))
Me.Name = name
Me.GetValue = getVal
Me.SetValue = setVal
End Sub
Public ReadOnly Name As String
Public ReadOnly GetValue As Func(Of Object)
Public ReadOnly SetValue As Action(Of Object)
End Class
在您的IDC类中,您现在可以声明并初始化属性列表,如下所示:
Private mPropList As List(Of PropertyAccessor)
Public Sub New()
mPropList = New List(Of PropertyAccessor)() From {
New PropertyAccessor("pID", Function() pID, Sub(value) pID = DirectCast(value, String)),
New PropertyAccessor("pCat", Function() pCat, Sub(value) pCat = DirectCast(value, String)),
New PropertyAccessor("pNum", Function() pNum, Sub(value) pNum = CInt(value)),
New PropertyAccessor("pVer", Function() pVer, Sub(value) pVer = DirectCast(value, String))
}
End Sub
基本上PropertyAccessor
包含可以为其分配函数(GetValue
)和子函数(SetValue
)的变量。您可以使用内联函数和名为Lambda Expressions的子函数来定义它们。
可以像这样设置和读取值:
Public Sub SetValues()
mPropList(0).SetValue("some id")
mPropList(1).SetValue("my category")
mPropList(2).SetValue(123)
mPropList(3).SetValue("1.0")
End Sub
Public Sub PrintValues()
For Each prop As PropertyAccessor In mPropList
Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue())
Next
End Sub
您也可以在VB中使用Auto-Implemented Properties,并且不需要声明支持变量:
Public Property pID As String
Public Property pCat As String
Public Property pNum As Integer
Public Property pVer As String