在迭代列表(T)时为值分配值

时间:2016-04-22 14:57:06

标签: vb.net

无法找到任何帮助,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:这更像是一个“可以做到”的好奇心,而不是“应该做什么”,因为我是新手,我正在尝试尝试并找到不同的做事方式学习...

2 个答案:

答案 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

Result

来自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