2016-04-22 4 views
0

Similar Questions stackoverflowは、このオファーを書いている間に助けもありません。(Tの)リストを反復しながらプロパティに値を代入する

プロパティと値をそれぞれリストに入れている間にループを反復しながら複数のプロパティの値を設定したい場合は、Forループのインデックスを使用して両方を選択しようとしています値とプロパティ。

私はこれまでに試したことはありますが、この質問を減らしたにもかかわらず、リスト内に格納するプロパティに値を設定しません。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私はこれを正しく説明して、上のコードを大量にカットして壊していないことを願っています。私はちょうどこれに直接答えを見つけることができないようで、これを管理するか、またはより多くのコードを作成するために '別の'クラスを作成する必要はありません。しかし、別のクラスが唯一の方法なら、私は選択肢がありません。

しかし、上記の考えを働かせることができれば、私は自分のコードにいくつかの他の場所があるので、これを適用することができます。

助けがよかったです。

EDIT:New List(Of String) From {"ID", "Cat", "Num", "Ver"}の使用のみがリストにあること、実際にアクセスOLEDB Readコマンドによって移入される「可能性」の値を示すことです。

EDIT2:それは私が私が実験と学習を希望して物事のさまざまな方法を見つけようとしている新たなんだと「それが行われる必要があります」より「が行うことができます」好奇心のより多くのです。..

+0

あなたはリフレクションを使用しますが、ことができ奇妙な要件であると思われる。ほとんどの場合、より良いアプローチがあります。なぜそれが必要ですか?関連情報のリストがある場合は、そのリストを使用しないでください。あるいは、 'Dictionary(String、String)'を使ってください。鍵はf.eです。 ID。 –

+0

{ID "、" Cat "、" Num "、" Ver "}の' '新しいリスト(Of String) 'の使用はリストにある可能性のある値を表示するだけです。アクセスOLEDB読み取りコマンドによって。 また、私は 'リフレクション 'が何であるかに精通していないので、私はそれを見上げるつもりです。 – nora

+0

しかし、データリーダーから適切な列を選択して、それを適切なプロパティに割り当てることができないのはなぜですか? –

答えて

0

謝罪私はt'stickの間違った終わりを抱えている - あなたはidcクラスのコレクションを使用して、各ループにaを使って反復することができますか? (notifcationsを処理したい場合はobservablecollection(of T))....

Okクイック(非常に汚い!)コードは要求通りです。その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 

フィードリストが必要な場合はDBに書き込みます。

私は私はあなたがが何をしたいのか把握してきた全くわからないんだけど、私は

は、簡単な例で29/04更新.....ツリーをt'wrongアップ吠えてる場合は、再度の謝罪ObservableCollectionの...

単純なWinフォームアプリケーション。

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から: -

***多くの場合、あなたはで動作するデータは、オブジェクトのコレクションです。たとえば、データバインディングの一般的なシナリオは、ListBox、ListView、TreeViewなどのItemsControlを使用してレコードのコレクションを表示することです。 IEnumerableインターフェイスを実装する任意のコレクションで列挙できます。ただし、コレクションの挿入または削除によってUIが自動的に更新されるように動的バインディングを設定するには、コレクションでINotifyCollectionChangedインターフェイスを実装する必要があります。このインターフェイスは、基になるコレクションが変更されるたびに発生するイベントであるCollectionChangedイベントを公開します。 WPFには、INotifyCollectionChangedインターフェイスを実装するデータコレクションの組み込みの実装であるObservableCollection(Of T)クラスが用意されています。 独自のコレクションを実装する前に、ObservableCollection(Of T)またはList(Of T)、Collection(Of T)、およびBindingList(Of T)などの既存のコレクションクラスのいずれかを使用することを検討してください。高度なシナリオを持ち、独自のコレクションを実装したい場合は、IListを使用することを検討してください。IListは、インデックスで個別にアクセスできるオブジェクトの非総称コレクションを提供します。 IListを実装すると、データバインディングエンジンで最高のパフォーマンスが得られます。

完全に結合標的に結合するソースオブジェクトからのデータ値を転送するサポートするために、バインド可能なプロパティをサポートして、あなたのコレクション内の各オブジェクトは、適切なプロパティは、INotifyPropertyChangedインターフェイスとして通知メカニズムを変更し実装する必要があります。***

+0

私は持っている(それはタプルと)いくつかのリストを供給することができます 'ブランククラス'を作るまだクラスを通して反復しようとするので、私はそれを行う方法がわかりません。そして、私は観察可能なコレクション(Tの)が何であるか分かりませんが、私は見つけ出すつもりです。あなたはあなたの応答を編集し、あなたが意味するものの例を示すことができますか? – nora

+0

私は表示することができるobservablecollectionを簡単にフォローしていません - 私はWPFコントロールにデータバインディングするときに使用しました。私はあなたがデータバインディングを開始するまでそれについて心配しないだろう –

+0

Ta Dave - 私はwotがt'formatで間違っているのか疑問に思った! –

0

あなたが欲しいですプロパティのリストからIDCクラスの実際のプロパティにアクセスします。 Visual Vincentがコメントで述べたように、プロパティアクセサー、つまり代理人を使うことができます。プロパティアクセサーとプロパティ名のクラスを作成します。あなたは今のプロパティは、このようなリストを宣言して初期化することができますIDCクラスで

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 

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 
関連する問題