【问题标题】:How to populate DevExpress GridControl with Dynamic Objects如何使用动态对象填充 DevExpress GridControl
【发布时间】:2017-06-22 19:16:15
【问题描述】:

我有一个返回对象数组的端点。我想通过将对象的键设为列并使用每个对象对应的值填充行来填充 DevExpress GridControl。问题是gridcontrol只有在我明确定义json对象的键是这样的时候才会填充:

       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);
        }
    }

这就是它的样子

【问题讨论】:

  • 网格是否有 Bind 或 DataBind 方法..?或者在填充列后尝试移动这个grid.ItemsSource = report;..
  • @MethodMan 该死,我移动了 grid.ItemsSource,它仍然产生相同的结果

标签: c# xamarin xamarin.forms devexpress


【解决方案1】:

所以我想通了,我所做的就是创建一个 DataTable。我从数组中取出一个对象并获取其所有属性来创建数据表列,然后创建一个函数 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);

    }

【讨论】:

    【解决方案2】:

    如果序列中的所有动态对象都具有统一的结构,则创建一个实现 ITypedList 接口的自定义集合类。

    ITypedList.GetItemPropertis 方法中,从集合中的第一个对象中检索所有可用的属性名称,并返回自定义属性描述符的集合。自定义属性描述符应该可以从给定属性名称的动态对象中读取/写入值。

    Grid 将使用属性描述符来访问动态对象中的值。此解决方案将有效,因为所有数据绑定组件本身都支持 ITypedList 集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多