尽管为它们分配了值,但 DataRows 仍为 null
Posted
技术标签:
【中文标题】尽管为它们分配了值,但 DataRows 仍为 null【英文标题】:DataRows coming out null despite assigning values to them 【发布时间】: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;
【问题讨论】:
【参考方案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 会导致数据网格视图中根本不显示任何表格。以上是关于尽管为它们分配了值,但 DataRows 仍为 null的主要内容,如果未能解决你的问题,请参考以下文章
尽管苹果放弃了对 iPhone 4S 的支持,但仍为 iOS 提交添加了 3.5 英寸的屏幕截图
Google GeoChart(Lavacharts 库)-> AddRow / AddRows 未在地图上呈现任何结果,尽管创建了值数组