我有一个返回对象数组的端点。我想通过使对象的键成为列并使用每个对象对应的值填充行来填充DevExpress GridControl。问题是当我明确定义json对象的键是这样的时,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"]
});
}
我不想对此进行硬编码,因为从我的端点返回的数组返回了不同的对象结构。 这是我到目前为止,它获取我的动态对象的属性,并使它们成为列名。它适用于创建列名,但行都是空的。
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);
}
}
这就是
的样子
答案 0 :(得分:1)
所以我想通了,我做的是创建一个DataTable。我从数组中获取了一个对象,并获得了所有属性来创建数据表列,然后创建了一个函数AddRow,以便向DataTable添加一行,并以相同的动态方式对所有对象进行操作。 / p>
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);
}
答案 1 :(得分:0)
如果序列中的所有动态对象都具有统一结构,请创建实现ITypedList接口的自定义集合类。
在ITypedList.GetItemPropertis方法中,从集合中的第一个对象检索所有可用的属性名称,并返回自定义属性描述符的集合。给定属性名称时,自定义属性描述符应该可以从/向动态对象读取/写入值。
Grid将使用属性描述符来访问动态对象中的值。此解决方案将起作用,因为所有数据绑定组件本身都支持ITypedList集合。