2017-06-22 64 views
0

オブジェクトの配列を返すエンドポイントがあります。私は、オブジェクトのキーを列にし、各オブジェクトに対応する値を持つ行を入力することによって、DevExpress GridControlを作成したいと考えています。DevExpress GridControlに動的オブジェクトを設定する方法

 foreach(dynamic item in json){ 
      report.Add(new 
      { 
       AccountID = item["AccountID"], 
       AccountTypeID = item["AccountTypeID"], 
       PrefixID = item["PrefixID"], 
       SuffixID = item["SuffixID"], 
       GenderID = item["GenderID"], 
       PrimaryContactID = item["PrimaryContactID"] 
      }); 
     } 

私はハードコードにしたくないが、私のエンドポイントから返された配列が異なっている。このために:問題はGRIDCONTROLが唯一の私は、明示的にJSONオブジェクトのキーは、このようなものであるかを定義するとき移入ということですオブジェクト構造が返されました。 これは私が今までに持っていたことですが、私の動的オブジェクトのプロパティを取得し、それらを列名にします。列名の作成には使用できますが、行はすべて空です。

public GridView() 
    { 
     InitializeComponent(); 
     DevExpress.Mobile.Forms.Init(); 
     PopulateGridView(); 
    } 

    public async void PopulateGridView() 
    { 
     dynamic json = await model.GetItemAsync(); 

     var report = new List<object>(); 
     var custom = new Dictionary<string, string>(); 

     foreach(dynamic item in json){ 
      report.Add(item); 
     } 

     grid.ItemsSource = report; 

     foreach (JProperty x in (JToken)json[0]) 
     { 
      TextColumn current = new TextColumn(); 
      current.FieldName = x.Name; 
      grid.Columns.Add(current); 
     } 
    } 

はここITypedListインターフェイスを実装するカスタムコレクションクラスを作成し、シーケンス内のすべての動的オブジェクトは、均一な構造を持っている場合はそれが

enter image description here

+0

グリッドにバインドまたはデータバインドメソッドがありますか。または、おそらくこの 'grid.ItemsSource = report;'を移動してみてください。 – MethodMan

+0

@MethodMan damn、私はgrid.ItemsSourceを移動しましたが、同じ結果が得られます –

答えて

1

私はそれを理解したので、私が行ったことはDataTableを作成することでした。 1つのオブジェクトを配列から取り出し、データテーブルの列を作成するためにすべてのプロパティを取得し、AddRow関数を作成してDataTableに行を追加し、同じ動的な方法ですべてのオブジェクトに対してforeachを実行しました。

public DataTable dataTable { get; set; } 

    public GridView(dynamic obj) 
    { 
     InitializeComponent(); 
     DevExpress.Mobile.Forms.Init(); 
     dataTable = new DataTable(); 
     PopulateGridView(); 
    } 

    public async void PopulateGridView() 
    { 
     dynamic json = await model.GetItemAsync(); 

     if(json == null){ 
      await Navigation.PopToRootAsync(); 
     } 

     AddColumns(json[0]); 

     foreach (dynamic item in json) 
     { 
      AddRow(item); 
     } 

     grid.ItemsSource = dataTable; 

    } 

    void AddColumns(dynamic obj) 
    { 
     foreach (JProperty x in (JToken)obj) 
     { 
      dataTable.Columns.Add(x.Name, typeof(string)); 
     } 
    } 

    void AddRow(dynamic obj) 
    { 
     DataRow row = dataTable.NewRow(); 

     foreach (JProperty x in (JToken)obj) 
     { 
      row[x.Name] = x.Value; 
     } 

     dataTable.Rows.Add(row); 

    } 
0

次のようになります。

ITypedList.GetItemPropertisメソッドでは、コレクション内の最初のオブジェクトから利用可能なすべてのプロパティ名を取得し、カスタムプロパティ記述子のコレクションを返します。カスタムプロパティ記述子は、プロパティ名を指定して動的オブジェクトから値を読み書きすることができます。

グリッドは、プロパティ記述子を使用して動的オブジェクト内の値にアクセスします。すべてのデータバインドコンポーネントがネイティブにITypedListコレクションをサポートするため、このソリューションは機能します。

関連する問題