我有一个WPF DataGrid控件,其数据如左图所示。我是WPF的初学者,正在努力实现正确的版本。我想' asd / qwe'和' A / B'作为行和列的标题,但它们的值和数字不同,我从一开始就不知道名称(可能还有一个' C'和' zxc')。
有没有办法实现这个目标?
答案 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。等作为属性。
虽然这可能不是解决问题的最佳方法,但与我的其他尝试相比,这导致了很少的代码行。