【问题标题】:How to add new rows to DataTable only under specific columns?如何仅在特定列下向 DataTable 添加新行?
【发布时间】:2013-02-16 11:00:21
【问题描述】:

我有一个 DataTable,dt2,我试图在其中添加新行(在下面代码的 else 块中)。我不能简单地在 foreach 循环中添加行(我尝试使用 dt2.Rows.Add(newRow); 行),因为这会破坏循环计数器或其他东西并导致以下错误:“集合已修改;枚举操作可能无法执行。 "

所以我尝试将新行值存储在列表中,然后将列表添加到循环外的表中。这在它编译并且确实添加了一些东西的意义上是有效的;不幸的是,它没有采用正确的值或列位置,而是显示这个废话:System.Collections.Generic.List`1[System.Object]

此外,信息应该显示在 Target_Folder、Target_File 和 Target_Checksum 下的第 3、4 和 5 索引列中,而不是在 Baseline_Folder 下。

如何在正确的列下存储和显示正确的值?

foreach (DataRow drow in dt2.Rows)
{
    if (drow["BASELINE_FILE"].ToString() == filename)
    {
        // do stuff
    }
    else
    {
        newRow = dt2.NewRow(); // newRow is a DataRow I declared up above
        newRow[3] = directory;
        newRow[4] = filename;
        newRow[5] = checksumList[j];
        newRow[6] = "Missing";
        //dt2.Rows.Add(newRow); 
        // can't add here because that increases the number of rows and screws up the foreach loop
        // therefore need to find way to store these values and add outside of loop
        newFiles.Add(newRow); // newFiles is a List
    }
}
dt2.Rows.Add(newFiles); // this doesn't work properly, doesn't take correct values

【问题讨论】:

  • 我面临同样的问题,任何人都可以提供解决方案,谢谢

标签: c# datatable datarow


【解决方案1】:

我认为这是你真正想做的:

DataRow[] drx = dt2.Select(string.Format("BASELINE_FILE = '{0}'" , filename));

if (drx.Length == 1)
 {
    // do stuff with drx[0]

 }
 else
 {
    newRow = dt2.NewRow(); // newRow is a DataRow I declared up above
    newRow[3] = directory;
    newRow[4] = filename;
    newRow[5] = checksumList[j];
    newRow[6] = "Missing";
    dt2.Rows.Add(newRow); 
 }

这样你就不需要遍历行了。

【讨论】:

  • 这是在做什么?你能解释一下第一行吗?
  • @user1985189 select 函数根据特定条件检查行并返回行集合。它像 sql select 一样工作。
【解决方案2】:

如果您希望遍历现有网格中的每一行,这应该可以为您完成。这样,currentRows 在循环运行时不会被修改,因为它将是该列表的浅表副本。

var currentRows = from row in dataTable.Rows select row;
foreach (var row in currentRows)
{
    if(doStuffCondition){ doStuff();}
    else{
      DataRow newRow = dataTable.NewRow();
      newRow[1] = newValue;  //repeat until values are loaded
      employeesDataTable.Rows.Add(newRow);
    }
 }

【讨论】:

    【解决方案3】:

    这不是我的想法,但按照这些思路应该可以工作:

    DataRow dr = dt2.NewRow();
    foreach (ListItem item in newFiles.Items)
    {
    dr[3] = item[3].ToString();
    dr[4] = item[4].ToString();
    etc.
    }
    

    如果您需要更多指导,请告诉我,我会仔细研究。

    【讨论】:

    • 我在哪里添加?在 foreach 循环之后?
    • newFiles 是在循环之外定义的,对吧?如果是这样,您可以在循环之后执行。
    • 它说 DataRow dr = new DataRow();由于其保护级别而无法访问并引发编译错误
    • 对不起,应该是 DataRow dr = dt2.NewRow();而且我没有提到您需要遍历列表。 foreach(newFiles.Items 中的 ListItem 项)等
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2013-03-17
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多