Zack Marrapese
Zack Marrapese

Reputation: 12080

Adding and Updating DataTable columns in C#

I am trying to add columns to a DataTable.

I can add the columns just fine. However, when I loop through the rows setting values for these new columns, it doesn't update the DataRow.ItemArray. Here is my code:

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;

      }
    }
  }

}

Upvotes: 1

Views: 1380

Answers (2)

SageMage
SageMage

Reputation: 1106

you should change your code to look something like this

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;

      }
    }
  }

}

Upvotes: 3

Zack Marrapese
Zack Marrapese

Reputation: 12080

One of my coworkers figured out the problem. The row.ItemArray shouldn't be accessed directly. Instead, I used row[columnName] = value to modify the column value.

Upvotes: 2

Related Questions