时间戳转换器

尽管为它们分配了值,但 DataRows 仍为 null

日期:2023-02-24     浏览:154    
【中文标题】尽管为它们分配了值,但 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 会导致数据网格视图中根本不显示任何表格。

相关文章

为啥我可以分配结构但不能比较它们

{...能比较它们【发布时间】:2010-12-2508:59:35【问题描述】:尽管我是一名长期的C程序员,但我最近才知道可以直接将结构变量相互分配,而不是使用memcpy:structMyStructa,b;...a=b;/*implicitmemcpy*/虽然这对C来说感觉有点“高级”,但它绝...}

是否在堆栈上分配了值类型的本地数组并立即收集垃圾? [复制]

{】是否在堆栈上分配了值类型的本地数组并立即收集垃圾?[复制]【英文标题】:Arelocalarraysofvaluetypesallocatedonstackandgarbagecollectedimmediately?[duplicate]【发布时间】:2021-09-2917:32:15【问题描述】:publicstaticVector2[]To1DArray(thisVector2[,]grid...}

退款后订阅状态仍为“ACTIVE”

{...在我的应用程序中。我每天检查一次每个活动订阅以检查它们是否仍然有效(我不使用Webhooks,只是一个自制的循环脚本)。如果订阅被取消(由买方或卖方),如果订阅过期或暂停,我可以成功检索。但没有什么可以告诉我订...}

将从核心数据中获取的数据分配给 UIPickerView

{...堆栈溢出,但没有任何答案能真正帮助我解决我的问题,尽管这似乎很容易。我有一个应用程序,其中包含一个存储字符串的实体。我可以很好地存储它们并在UITableView中获取它们,但有时我需要获取它们并将它们放}

Android Studio - 真正的 Android 设备上的 Google 地图在发布 apk 时仍为空白

{】AndroidStudio-真正的Android设备上的Google地图在发布apk时仍为空白【英文标题】:AndroidStudio-GooglemapstillblankonrealAndroiddeviceonreleaseapk【发布时间】:2015-08-1402:12:58【问题描述】:用谷歌搜索它,阅读数百万条关于如何生成谷歌API密...}

源不包含 DataRows

{】源不包含DataRows【英文标题】:ThesourcecontainsnoDataRows【发布时间】:2015-04-0404:09:42【问题描述】:DataTabledt=ds.Tables[4].AsEnumerable().Where(x=>((DateTime)x["EndDate"]).Date>=DateTime.Now.Date).CopyToDataTable();ds.Tables[4]有行但会抛出}

尽管已安装 Python 模块,但未检测到它们

{】尽管已安装Python模块,但未检测到它们【英文标题】:Pythonmodulesnotbeingdetectedalthoughtheyareinstalled【发布时间】:2016-07-2002:45:41【问题描述】:我有一个旧版本的Python。然后我卸载了旧版本,并安装了一个新版本-2.7.9。我通过pyen...}

数据结构第八章

{...。这样会比直接插入中使用的顺序查找法快但时间复杂度仍为O(n^2)希尔排序:先将待排序列分组,对每组进行直接插入排序,增加数据量重新分组。是不稳定的排序交换排序冒泡排序:会先得到最大的数  时间复杂度...}

尽管通过赋值更改了数组,但 Vue.js 列表没有更新

{】尽管通过赋值更改了数组,但Vue.js列表没有更新【英文标题】:Vue.jslistnotupdatingdespitearraychangeviaassignment【发布时间】:2020-09-1319:35:21【问题描述】:我是vue.js的新手,但我正在尝试显示来自底层数组的选项列表。但是,当底...}

两个文本输入值已更新,一个仍为空白

{】两个文本输入值已更新,一个仍为空白【英文标题】:Twotextinputsvaluesareupdated,oneisstillblank【发布时间】:2017-08-0420:27:16【问题描述】:在我看来,我有两个文本输入字段。每个都嵌入在他们的段落中。<p><inputid="filterNearb...}

Copyright ©2021 时间戳转换器 小常识 114pp | 陕ICP备18005036号