【问题标题】:DataRows coming out null despite assigning values to them尽管为它们分配了值,但 DataRows 仍为 null
【发布时间】:2014-03-29 21:02:36
【问题描述】:

我正在尝试学习如何使用 Linq 将两个数据表合并为一个。我的 linq 查询工作正常,我可以在其中看到预期值。但是,当我循环 linq 结果并将值分配给新创建的数据行并将该行添加到新数据表时,这些行出来为空。

这是我的代码:

private void btnCombine_Click(object sender, EventArgs e)
{

    var innerJoinQuery =
        from strRow in StrDataTable.AsEnumerable()
        join intRow in IntDataTable.AsEnumerable() 
            on strRow.Field<int>("IntID") equals intRow.Field<int>("ID")
        select new { 
            IntOne = intRow.Field<int>("FirstNum"), 
            IntTwo = intRow.Field<int>("SecondNum"), 
            StrOne = strRow.Field<string>("FirstStr"),
            StrTwo = strRow.Field<string>("SecondStr"), 
            StrThree = strRow.Field<string>("SecondStr")
        };

    DataTable newTable = new DataTable();
    newTable.Columns.Add("IntOne");
    newTable.Columns.Add("IntTwo");
    newTable.Columns.Add("FirstStr");
    newTable.Columns.Add("SecondStr");
    newTable.Columns.Add("ThirdStr");

    newTable.Columns["IntOne"].DataType = System.Type.GetType("System.String");
    newTable.Columns["IntTwo"].DataType = System.Type.GetType("System.String");
    newTable.Columns["FirstStr"].DataType = System.Type.GetType("System.String");
    newTable.Columns["SecondStr"].DataType = System.Type.GetType("System.String");
    newTable.Columns["ThirdStr"].DataType = System.Type.GetType("System.String");

    foreach (var row in innerJoinQuery)
    {
        DataRow rowToAdd = newTable.NewRow();
        rowToAdd.ItemArray[0] = row.IntOne.ToString();
        rowToAdd.ItemArray[1] = row.IntTwo.ToString();
        rowToAdd.ItemArray[2] = row.StrOne.ToString();
        rowToAdd.ItemArray[3] = row.StrTwo.ToString();
        rowToAdd.ItemArray[4] = row.StrThree.ToString();

        newTable.Rows.Add(rowToAdd);
    }

    dataGridView3.DataSource = newTable;
}

【问题讨论】:

    标签: c# mysql sql linq datatable


    【解决方案1】:

    使用带有单个值的 DataRow.ItemArray 属性不起作用 - 相反,创建 object[] 数组,然后将整个内容设置为 .ItemArray 属性。有关其他示例,请参阅此 MSDN page

    foreach (var row in innerJoinQuery)
    {
        DataRow rowToAdd = newTable.NewRow();
    
        object[] items = new object[] {
            row.IntOne.ToString(),
            row.IntTwo.ToString(),
            row.StrOne.ToString(),
            row.StrTwo.ToString(),
            row.StrThree.ToString()
        };
    
        rowToAdd.ItemArray = items;
    
        newTable.Rows.Add(rowToAdd);
    }
    

    或者,直接使用DataRow 索引器,它适用于单个列:

    rowToAdd[0] = row.IntOne.ToString();
    rowToAdd[1] = row.IntTwo.ToString();
    rowToAdd[2] = row.StrOne.ToString();
    rowToAdd[3] = row.StrTwo.ToString();
    rowToAdd[4] = row.StrThree.ToString();
    

    此外,在创建列时,有一个构造函数采用可以为您节省一些代码的类型。您的前两个列类型不匹配。

    newTable.Columns.Add("IntOne", typeof(int));
    newTable.Columns.Add("FirstStr", typeof(string));
    

    【讨论】:

      【解决方案2】:

      前两个值似乎是整数:

      IntOne = intRow.Field<int>("FirstNum"), 
      IntTwo = intRow.Field<int>("SecondNum"), 
      

      但是您将列分配给的DataType 是字符串:

      newTable.Columns["IntOne"].DataType = System.Type.GetType("System.String");
      newTable.Columns["IntTwo"].DataType = System.Type.GetType("System.String");
      

      将这些更新为 int 并查看是否可以解决问题:

      newTable.Columns["IntOne"].DataType = System.Type.GetType("System.Int32");
      newTable.Columns["IntTwo"].DataType = System.Type.GetType("System.Int32");
      
      rowToAdd.ItemArray[0] = row.IntOne;
      rowToAdd.ItemArray[1] = row.IntTwo;
      

      您可能还需要为列提供DataPropertyName

      newTable.Columns["IntOne"].DataPropertyName = "FirstNum";
      newTable.Columns["IntTwo"].DataPropertyName = "SecondNum";
      ...
      

      并确保AutoGenerateColumns 值设置为false

      dataGridView3.AutoGenerateColumns = false;
      

      【讨论】:

      • 将第一个到列的数据类型设置为 Int32 不起作用。我尝试设置 DataPropertyName 但该属性似乎不存在。将 AutoGenerateColumns 设置为 false 会导致数据网格视图中根本不显示任何表格。
      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多