在C#中添加和更新DataTable列



我正在尝试向DataTable添加列。

我可以很好地添加列。然而,当我循环浏览这些新列的行设置值时,它不会更新DataRow.ItemArray

private void UpdateTabularDataTable(SqlConnection connection)
{
      // when I add these columns, it works fine.
      var rejectedColumn = table.Columns.Add(Constants.RejectedUiColumnName, typeof(bool));
      var rejectedReasonColumn = table.Columns.Add(Constants.RejectedReasonUiColumnName, typeof(string));
      foreach (var row in table.Rows.Cast<DataRow>())
      {
        var contourId = (Guid)row.ItemArray[0];
        // this is a Dictionary of objects which are rejected.  The others are accepted.
        string rejectedReason;
        var isRejected = _rejectedParticleReasonHolder.TryGetValue(contourId.ToString(), out rejectedReason);
        // these assignments don't work.  There's no exception; they 
        // just don't update the relevant values on the object.
        // Also, I verified that the Ordinal values are correct.
        row.ItemArray[rejectedColumn.Ordinal] = isRejected;
        row.ItemArray[rejectedReasonColumn.Ordinal] = rejectedReason;
      }
    }
  }
}

您应该更改代码,使其看起来像

private void UpdateTabularDataTable(SqlConnection connection)
{
      table.Columns.Add(Constants.RejectedUiColumnName, typeof(bool));
      table.Columns.Add(Constants.RejectedReasonUiColumnName, typeof(string));
      foreach (var row in table.Rows.Cast<DataRow>())
      {
        var contourId = (Guid)row.ItemArray[0];
        // this is a Dictionary of objects which are rejected.  The others are accepted.
        string rejectedReason;
        var isRejected = _rejectedParticleReasonHolder.TryGetValue(contourId.ToString(), out rejectedReason);
        row[Constants.RejectedUiColumnName] = isRejected;
        row[Constants.RejectedReasonUiColumnName] = rejectedReason;
      }
    }
  }
}

我的一位同事发现了这个问题。不应直接访问row.ItemArray。相反,我使用row[columnName] = value来修改列值。

最新更新