如何在 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