【问题标题】:how to display binded items in gridview for one to many relation table如何在gridview中为一对多关系表显示绑定项目
【发布时间】:2015-08-03 17:56:53
【问题描述】:

我从一个列表中绑定了 Devexpress gridcontrol,该列表从一个到多个关系表中获取数据。我的意思是,我有一个用于许多“analiseID”的“nID”。

Gridview 显示一个在另一个之下的记录,如下所示:

nID 分析

2     A
2     C
2     D
3     A
3     C

...

我需要gridview来显示数据;根据表中的分析,每个 nID 只有一条记录,并且其分析将带有在分析名称下选中的复选框。分析名称将在 gridview 的标题部分。分析字段将在其 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;

请给我意见。谢谢。

【问题讨论】:

    标签: c# list gridview checkbox devexpress


    【解决方案1】:

    您必须创建一个数据表。列数将是您分析的计数 然后你必须为每个 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;
    

    如果你想在控制台上看到表格,你可以使用这个

    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 
    

    【讨论】:

    • 感谢您的回答。我实际上使用 List 作为数据源。所以,我无法应用您的代码。我更新了我的问题。你能看一下吗?
    • 已更新。我只更改了字典的创建。
    • 它有效,谢谢!而且,如果我需要显示更多列怎么办?字典只有 int 和 string。我还有几个列,例如来自班级的 nName、rName、rNumber。
    • 在 table.Columns.Add("ID") 下添加更多列;然后在 row["ID"] = item.Key;搜索并找到该 ID 的详细信息。(或者您必须更改创建表的算法..)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2014-07-01
    • 2016-07-20
    • 2013-03-08
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多