Как связать коллекциюПоля для GridControl WPF? - PullRequest
0 голосов
/ 25 февраля 2019

Я ищу в 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
  • Я не хочу использовать Dataatable с GridControl
  • Я не хочу использовать ADO.NET с GridControl

i Просто хочу заполнитьGridControl из коллекции полей.Любое предложение, такое как LINQ, динамическое связывание будет оценено.

1 Ответ

0 голосов
/ 25 февраля 2019

Пожалуйста, посмотрите следующий код:

Примечание: Из-за ограниченного времени я преобразовал конечный объект (ExpendoObject) в анонимный тип с помощью Newtonsoft json (так как объект расхода не может привязываться к сетке).Вы можете улучшить код.

Кроме того, я добавил дополнительное свойство "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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...