WPF列到矩阵

时间:2015-02-26 15:06:22

标签: c# .net wpf xaml

我有一个WPF DataGrid控件,其数据如左图所示。我是WPF的初学者,正在努力实现正确的版本。我想' asd / qwe'和' A / B'作为行和列的标题,但它们的值和数字不同,我从一开始就不知道名称(可能还有一个' C'和' zxc')。

有没有办法实现这个目标?

Concept

2 个答案:

答案 0 :(得分:2)

可能有点晚了,你可能已经尝试过了,但以下内容对我有用。即使有很多循环,它也会以快速的方式处理它。

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


    }

答案 1 :(得分:0)

我最终迭代了每个&#39; qwe&#39; asd&#39;添加新列。然后使用&#39; qwe&#39;为每一行创建一个ExpandoObject。等作为属性。

虽然这可能不是解决问题的最佳方法,但与我的其他尝试相比,这导致了很少的代码行。