C# 尽管为数据行赋值,但数据行仍为空

C# 尽管为数据行赋值,但数据行仍为空,c#,mysql,sql,linq,datatable,C#,Mysql,Sql,Linq,Datatable,我正在尝试学习如何使用Linq将两个数据表合并为一个。我的linq查询工作正常,我可以在其中看到预期值。但是,当我循环linq结果,并将值分配给新创建的数据行并将该行添加到新的数据表时,这些行将变为空 这是我的密码: private void btnCombine_Click(object sender, EventArgs e) { var innerJoinQuery = from strRow in StrDataTable.AsEnumerable()

我正在尝试学习如何使用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;
}
private void btnCombine\u单击(对象发送方,事件参数e)
{
var innerJoinQuery=
来自StrDataTable.AsEnumerable()中的strow
在IntDataTable.AsEnumerable()中加入intRow
在strRow.Field上(“IntID”)等于intRow.Field(“ID”)
选择新{
IntOne=intRow.Field(“FirstNum”),
IntTwo=intRow.Field(“SecondNum”),
StrOne=strow.Field(“FirstStr”),
StrTwo=strow.Field(“SecondStr”),
strtree=strow.Field(“SecondStr”)
};
DataTable newTable=新DataTable();
newTable.Columns.Add(“IntOne”);
newTable.Columns.Add(“IntTwo”);
newTable.Columns.Add(“FirstStr”);
newTable.Columns.Add(“SecondStr”);
新增表格。列。添加(“第三条”);
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(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.strTree.ToString();
newTable.Rows.Add(rowToAdd);
}
dataGridView3.DataSource=newTable;
}

前两个值似乎是整数:

IntOne = intRow.Field<int>("FirstNum"), 
IntTwo = intRow.Field<int>("SecondNum"), 
将这些更新为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;

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

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);
}
或者,直接使用
数据行
索引器,该索引器可用于单个列:

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));

将第一列的数据类型设置为Int32无效。我尝试设置DataPropertyName,但该属性似乎不存在。将AutoGenerateColumns设置为false会导致数据网格视图中根本不显示任何表。
newTable.Columns.Add("IntOne", typeof(int));
newTable.Columns.Add("FirstStr", typeof(string));