2015-02-26 3 views
1

У меня есть элемент управления DataGrid WPF с данными, как на левом изображении. Я новичок в WPF и пытаюсь достичь нужной версии. Я хочу, чтобы «asd/qwe» и «A/B» были заголовками для строк и столбцов, но они меняются по значениям и номерам, и я не знаю имена с самого начала (может также быть «C» и «zxc» «).WPF Столбцы к матрице

Есть ли способ достичь этого?

Concept

+0

a, b рядные заголовки? или просто нормальная клетка? – Muds

+1

Вам нужны возможности выбора DataGrid? Если нет, использование вложенного элемента ItemsControl может быть проще. Но в противном случае вам, вероятно, придется упорядочить свои данные из кода в формате, который может быть легко отображен DataGrid – Rachel

+0

. Я хочу, чтобы они были заголовками, если это возможно. – Mystogan

ответ

1

Может быть, немного поздно, и вы, возможно, уже пробовали это, но для меня работает следующее. Несмотря на то, что существует множество циклов, он быстро об этом позаботится.

class Program 
    { 
     private static DataTable Table = new DataTable(); 

     static void Main(string[] args) 
     { 
      Table.Columns.Add("Col1"); 
      Table.Columns.Add("Col2"); 
      Table.Columns.Add("Col3"); 
      Table.Rows.Add(new object[] { "A", 1, "asd" }); 
      Table.Rows.Add(new object[] { "A", 0, "qwe" }); 
      Table.Rows.Add(new object[] { "B", 1, "asd" }); 
      Table.Rows.Add(new object[] { "B", 1, "qwe" }); 
      Table.Rows.Add(new object[] { "C", 2, "qwe" }); 
      Table.Rows.Add(new object[] { "C", 5, "asd" }); 

      Gen(Table); 
     } 


     public class Set 
     { 
      public string A { get; set; } 
      public string B { get; set; } 
      public object Value { get; set; } 
     } 


     public static DataTable Gen(DataTable Tbl) 
     { 



      // Build objects 
      var List = new List<Set>(); 

      foreach(DataRow Row in Tbl.Rows) 
      { 

       List.Add(new Set { A = (String)Row["Col1"], B = (String)Row["Col3"],Value = Row["Col2"] }); 
      } 

      var TableBuild = new DataTable(); 
      TableBuild.Columns.Add("X"); 

      var DistinctColumnDefiners = List.Select(t => t.B).Distinct(); 
      var DistinctRowDefiners = List.Select(t => t.A).Distinct(); 

      for (int i = 0; i < DistinctColumnDefiners.Count(); i++) 
      { 
       TableBuild.Columns.Add(); 
       TableBuild.Columns[i + 1].ColumnName = DistinctColumnDefiners.ToArray()[i]; 
      } 

      for (int i = 0; i < DistinctRowDefiners.Count(); i++) 
      { 
       TableBuild.Rows.Add(); 
       TableBuild.Rows[i]["X"] = DistinctRowDefiners.ToArray()[i]; 
      } 

      for (int i = 0; i < DistinctRowDefiners.Count(); i++) 
      { 
       for (int k = 0; k < DistinctColumnDefiners.Count(); k++) 
       { 

        TableBuild.Rows[i][DistinctColumnDefiners.ToArray()[k]] = List.Where(t => t.A == (String)TableBuild.Rows[i]["X"] && t.B == (String)DistinctColumnDefiners.ToArray()[k]).Select(f=>f.Value).FirstOrDefault(); 

       } 

      } 


       return TableBuild; 
     } 


    } 
+0

Спасибо за ответ! Я буду использовать это в следующий раз! – Mystogan

0

Я в конечном итоге итерация каждого 'Qwe', 'ASD', чтобы добавить новые столбцы. Затем создаем ExpandoObject для каждой строки с параметрами «qwe» и т. Д. В качестве свойств.

Хотя это, вероятно, не лучший способ решить проблему, это привело к очень немногим строкам кода по сравнению с моими другими попытками.

Смежные вопросы