【问题标题】:How to bind a Collection of <string, object> Fields to GridControl WPF?如何将 <string, object> 字段的集合绑定到 GridControl WPF?
【发布时间】:2019-02-25 00:03:19
【问题描述】:

我搜索google,社区,所以我在搜索和挖掘后问了这个问题

我有一个在运行时填充的列和值的集合,因此我想从字段集合中填充 GridControl,但我不想使用 DataTable 或任何 ADO.NET 东西。只有.net 集合。 我也不想使用具有固定属性的固定类,如 Employee 类并列出 Employee。 不,我不需要那个,

我只需要在运行时从我的自定义字段列表或字典中创建 GridControl WPF 控件的列和值

List<Field> Fields {get;set;}

public class Field{
   public string ColumnID{get;set;}
   public object Value{get;set;}
}

测试阶段

Field field1 = new Field();
field1.ColumnID = "branchID";  // this column id at runtime i got it
field1.Value = 100;

Field field2 = new Field();
field2.ColumnID = "customerID"; // at runtime but this for example
field2.Value = 1; // at runtime but this for example

Field field3 = new Field();
field3.ColumnID = "Runtime-ColumnID" ;
field3.Value = RuntimeValue;

Fields.Add(field1);
Fields.Add(field2);
fields.Add(field3);

请问如何存档:

  • 我不想将 DataSet 与 GridControl 一起使用
  • 我不想将 Datatable 与 GridControl 一起使用
  • 我不想将 ADO.NET 与 GridControl 一起使用

我只想从字段集合中填充 GridControl。任何 像 LINQ 这样的建议,动态绑定将被应用。

【问题讨论】:

    标签: c# .net wpf collections ado.net


    【解决方案1】:

    请看下面的代码;

    注意:由于时间有限,我使用Newtonsoft json将最终对象(ExpendoObject)转换为匿名类型(因为expendo对象无法绑定到网格)。您可以改进代码。

    此外,我在 Field 类中添加了附加属性“RowNumber”,它将指示程序在特定行中映射列。

     public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            List<Field> fields = new List<Field> {
                new Field{ ColumnID="Name", Value="Kamran" , RowNumber=1},
                new Field{ ColumnID="Age", Value=25 , RowNumber = 1},
                new Field{ ColumnID="Name", Value="Asim", RowNumber = 2, },
                new Field{ ColumnID="Age", Value=30 , RowNumber = 2 },
                new Field{ ColumnID="Department", Value="Computer" , RowNumber = 2},
            };
    
            var result = fields.ToPivotArray(item => item.ColumnID, item => item.RowNumber, items => items.FirstOrDefault()?.Value);
    
            string json = JsonConvert.SerializeObject(result, new KeyValuePairConverter());
            var obj = JArray.Parse(json);
            testGrid.ItemsSource = obj;
        }
    }
    
    public static class Extension
    {
        public static dynamic[] ToPivotArray<T, TColumn, TRow, TData>(this IEnumerable<T> source, Func<T, TColumn> columnSelector,
                                                                       Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
        {
            var arr = new List<object>();
            var cols = new List<string>();
            String rowName = ((MemberExpression)rowSelector.Body).Member.Name;
            var columns = source.Select(columnSelector).Distinct();
            //cols = (new[] { rowName }).Concat(columns.Select(x => x.ToString())).ToList();
            cols = (columns.Select(x => x.ToString())).ToList();
            var rows = source.GroupBy(rowSelector.Compile())
                             .Select(rowGroup => new
                             {
                                 Key = rowGroup.Key,
                                 Values = columns.GroupJoin(
                                     rowGroup,
                                     c => c,
                                     r => columnSelector(r),
                                     (c, columnGroup) => dataSelector(columnGroup))
                             }).ToArray();
    
            foreach (var row in rows)
            {
                var items = row.Values.Cast<object>().ToList();
                // items.Insert(0, row.Key);
                var obj = GetAnonymousObject(cols, items);
                arr.Add(obj);
            }
            return arr.ToArray();
        }
        private static dynamic GetAnonymousObject(IEnumerable<string> columns, IEnumerable<object> values)
        {
            IDictionary<string, object> eo = new ExpandoObject() as IDictionary<string, object>;
            int i;
            for (i = 0; i < columns.Count(); i++)
            {
                eo.Add(columns.ElementAt<string>(i), values.ElementAt<object>(i));
            }
            return eo;
        }
    
    }
    
    public class Field
    {
        public string ColumnID { get; set; }
        public object Value { get; set; }
        public int RowNumber { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多