2016-04-22 84 views
0

找不到對此的任何幫助,而且Similar Questions stackoverflow建議在編寫此提議時也沒有幫助。在迭代列表(T)時爲屬性賦值Value

我想設置多個屬性的值,同時迭代一個For i = 0循環,同時使屬性和值都在列表中,我試圖使用For循環的索引來選擇價值和財產。

我到目前爲止所嘗試的是儘管減少了這個問題,但它並沒有設置任何值屬性(S)它只是存儲在列表mPropList本身,我需要存儲值屬性(或沼澤標準變量,但我寧願地產(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 

I希望我已經正確地解釋了這一點,並沒有將上面的代碼削減得太多而且破壞了它。我似乎無法找到直接的答案,也不希望創建'另一個'類來管理這個或創建更多的代碼。但如果另一個班級是唯一的方式,我想我別無選擇。

但是,如果上述想法可以工作,我在我的代碼中有其他幾個地方我可以應用這個,所以手指交叉。

任何幫助將是很好的。

編輯:採用New List(Of String) From {"ID", "Cat", "Num", "Ver"}是隻顯示值是「可」出現在列表中,實際上是由接入OLEDB讀取命令填充。

EDIT2:它更多的是「能不能做到」的好奇心,「要那樣」,因爲我是新我試圖嘗試並找到學習的希望做事的方式不同..

+0

您可以使用反射但似乎是一個奇怪的要求。在大多數情況下,有更好的方法。你爲什麼需要這個?如果您有相關信息的列表,爲什麼不使用該列表。或者,也許:使用「Dictionary(Of String,String)」。關鍵是f.e. 'ID'。 –

+0

從{「ID」,「Cat」,「Num」,「Ver」}'新列表(字符串)的使用僅顯示*'可能'*在列表中的值,實際上已填充通過Access OLEDB讀取命令。 此外,我不熟悉「反射」是什麼,所以我要查找。 – nora

+0

但是,爲什麼不能從數據讀取器中選擇適當的列並將其分配給正確的屬性? –

回答

0

道歉如果我弄錯了t'stick的結尾 - 你可以使用一個idc類的集合,並遍歷每個循環使用a? (如果你想處理notifcations的話,可以通過一個可觀察的集合(T))...

確定一些快速(並且非常髒!不知道如果你想但在這裏不用WOT ......資源是現有的類礦井我在導入。

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 

在每個循環資源的每個屬性是可用做任何你想要飼料列表,寫入數據庫。

我不能完全肯定,我抓住你想要做雖然什麼,所以再次道歉,如果我吠叫t'wrong樹.....

更新29/04用簡單的例子一個ObservableCollection .....

一個簡單的Win Forms應用程序。

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接口。***

+0

我有尚未嘗試遍歷一個Class,所以我不確定如何做到這一點。我不知道(T)的可觀察集合是什麼,但是我會發現。你能編輯你的回答並展示你的意思嗎? – nora

+0

我沒有一個易於遵循的observablecollection,我可以顯示 - 我在數據綁定到WPF控件時使用了它。我不會擔心它,直到你開始數據綁定 –

+0

塔戴夫 - 我想知道這是錯誤的格式! –

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