【问题标题】:Datatable modify column with row数据表用行修改列
【发布时间】:2012-10-11 14:15:39
【问题描述】:

我想在数据表中修改我的表。我知道我必须使用linq 并将结果分组。 之前:

ID     Name   LastName
1      Kiki    ha 
3      lola    mi 
2      ka      xe 
2      Kiki    ha

之后:

Name  LastName   1   3   2
Kiki   ha        x       x
lola   mi            x
ka     xe                x

我的原始代码:

    DataTable table1 = new DataTable("table"); 
    table1.Columns.Add("ID", typeof(String)); 
    table1.Columns.Add("Name", typeof(String)); 
    table1.Columns.Add("Lastname", typeof(String)); 

    object[] a1 = { 1, "Kiki", "ha" }; 
    object[] a2 = { 3, "lola", "mi" }; 
    object[] a4 = { 2, "ka", "xe" }; 
    object[] a5 = { 2, "kiki", "ha" };
    table1.Rows.Add(a1); 
    table1.Rows.Add(a2); 
    table1.Rows.Add(a4);        
    table1.Rows.Add(a5); 

我也试过了,但是没用:

    var result = from t1 in table1.AsEnumerable()
                 group t1 by new {ID = t1.Field<String>("ID")} into grp
                  select new
                     {
                         ID = grp.Key.ID,
                         //something must be there
                     };
     DataGridView1.DataSource = result.ToList();

【问题讨论】:

  • 您真的要为该表中的每个 id 添加一列吗?
  • 是的,我想为每个 ID 添加列,所以应该是第 1 列、第 3 列和第 2 列
  • ... 而 xx 还是布尔值?
  • 当然x表示用户有那个ID。
  • 我更喜欢 x 而不是 bool :p coz 然后当我将它转换为 excel 时我可以看到 x

标签: c# datatable multiple-columns


【解决方案1】:

这应该可以满足您的需要:

var nameGroups = from row in table1.AsEnumerable()
                 group row by new
                 {
                     Name = row.Field<string>("Name").ToLower(),
                     LastName = row.Field<string>("Lastname").ToLower(),
                 } into NameGroups
                 select NameGroups;

var tblOut = new DataTable();
tblOut.Columns.Add("Name");
tblOut.Columns.Add("LastName");
var distinctIDs = table1.AsEnumerable()
                        .Select(r => r.Field<string>("ID"))
                        .Distinct();

foreach (var id in distinctIDs)
    tblOut.Columns.Add(id);

foreach (var grp in nameGroups)
{
    var row = tblOut.Rows.Add();
    row.SetField<string>("Name", grp.Key.Name);
    row.SetField<string>("LastName", grp.Key.LastName);
    foreach (DataColumn idCol in tblOut.Columns.Cast<DataColumn>().Skip(2))
    {
        bool userHasID = grp.Any(r => r.Field<string>("ID") == idCol.ColumnName);
        row.SetField<string>(idCol, userHasID ? "x" : "");
    }
}

请注意,我输出的是小写名称,因为我需要不区分大小写。

编辑:这是调试器窗口中DataTable 的屏幕截图:

【讨论】:

  • 我试过你的代码,我可以看到表格但没有第 2 列和 bool 参数,dataGridView1.DataSource = tblOut;我该怎么办?
  • @UniLe:我已经编辑了我的答案,向您展示 DataTable 是您所要求的。
  • 是的,这是正确的,它对我有用。也许您的网格不够大,或者您必须滚动。然而,这是另一个问题。您可以在调试器中看到结果是正确的。只需添加一个断点并在快速观察窗口中检查tblOut。然后点击老花镜图标。
  • 我怎样才能改变你的代码,而不是 x 应该是表格列中的另一个值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2010-11-19
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多