如何在 gridview 中显示一对多关系的绑定项 table
how to display binded items in gridview for one to many relation table
我从一个列表中绑定了 Devexpress gridcontrol,该列表从一个到多个相关 table 中获取数据。我的意思是,我有一个 "nID" 很多 "analiseID"s.
Gridview 像这样一条一条地显示记录:
nID 分析
2 A
2 C
2 D
3 A
3 C
...
我需要gridview来显示数据;根据 table 中的分析,每个 nID 仅记录一条记录,并且其分析将在分析名称下选中复选框。 Analise 名称将出现在 gridview 的标题部分。 Analise 字段将在其 nID 附近显示为已选中。像这样:
nID A B C D E
..(共 34 次分析)
2 checked checked checked
3 checked checked
我像这样绑定 gridcontrol:
List<nAnalises> lst = new List<nAnalises>();
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
nAnalises na = new nAnalises();
na.nID = Convert.ToInt32(sdr["nID"]);
na.rNumber = Convert.ToInt32(sdr["rNumner"]);
na.nName = sdr["nName"].ToString();
na.analiseID = Convert.ToInt32(sdr["analiseID"]);
na.analiseName = sdr["analiseName"].ToString();
lst.Add(na);
}
gridControl1.DataSource = lst;
请给我出出主意。谢谢。
您必须创建一个 Datatable.The 列数,这将是您的 Analises 的计数 然后你必须为每个 nID 添加 1 行并为每一列设置值。
这是一个代码示例
List<nAnalises> lst = new List<nAnalises>();
lst.Add(new nAnalises() { Id = 2, Name = "A" });
lst.Add(new nAnalises() { Id = 2, Name = "D" });
lst.Add(new nAnalises() { Id = 3, Name = "A" });
lst.Add(new nAnalises() { Id = 3, Name = "C" });
Dictionary<int, string[]> values =
(from i in lst
group i by i.Id into g
select new {
Id = g.Key,
Values = g.Select(ee => ee.Name).Distinct().ToArray()
}
).ToDictionary(ee => ee.Id, ee => ee.Values);
DataTable table = new DataTable();
table.Columns.Add("ID");
foreach (var item in values.Values.SelectMany(EE => EE).Distinct())
table.Columns.Add(item);
foreach (var item in values)
{
DataRow row = table.NewRow();
foreach (DataColumn column in table.Columns)
{
row[column.ColumnName] = false;
foreach (var value in item.Value)
if (value == column.ColumnName)
row[value] = column.ColumnName == value;
}
row["ID"] = item.Key;
table.Rows.Add(row);
}
然后
grid.Datasource=table;
如果你想在控制台上看到 table 你可以使用这个
foreach (DataColumn col in table.Columns)
Console.Write(string.Format("{0,10}", col.ColumnName) + " ");
Console.WriteLine();
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
Console.Write(string.Format("{0,10}", row[col.ColumnName]) + " ");
Console.WriteLine();
}
上面的例子打印
ID A D C
2 True True False
3 True False True