如何使用动态对象填充DevExpress GridControl

时间:2017-06-22 19:16:15

标签: c# xamarin xamarin.forms devexpress

我有一个返回对象数组的端点。我想通过使对象的键成为列并使用每个对象对应的值填充行来填充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);
        }
    }

这就是

的样子

enter image description here

2 个答案:

答案 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集合。