如何编辑 DataTable 列值

How to Edit DataTable Column Value

Excel 列名可能包含尾随空格,如果列因空格而不匹配,则会出现异常。

我正在寻找处理数据表中列名尾随空格的方法。

foreach (DataRow row in caseTable.Rows)
{
    foreach (DataColumn column in caseTable.Columns)
    {
        if (!(string.isNullOrEmpty(column.toString())))
        {
            //Cannot assign value to 'column' because it is in a 'foreach iteration variable'
            column = column.ToString().TrimStart().TrimEnd(); 
            trimmed = 1;
        }
    }
    while (trimmed == 0) ;
}

...

//errored out due to 'Excel.firstName' value not existing in DataTable due to trailing spaces
if (row[Excel.firstName].ToString().Trim() != "")
{
    caseEntity.Attributes[Case.firstName] = row[Excel.firstName];
}

你的代码有两个错误:

  1. 您正在使用 foreach 迭代序列并尝试修改迭代项;因此,抛出异常。
  2. 您正在尝试替换列对象而不是其名称。

此外,您正在滥用 ToString,并且正如 Michal Turczyn 所述,您没有使用明确设计用于测试空字符串或空字符串的内置 String 方法。

您可以尝试将内循环中的代码替换为

var oldName = column.ColumnName;
if (!string.IsNullOrEmpty(oldName))
{
    var newName = oldName.Trim();
    if (newName != oldName)
    {
        column.ColumnName = newName;
        trimmed = 1;
    }
}

从这个替换代码可以看出:

  1. 你应该 read/write ColumnName 属性 而不是 ToString.
  2. 您可以通过使用 Trim.
  3. 来避免一个接一个(以任何顺序)调用 TrimStartTrimEnd
  4. 您应该使用 string.IsNullOrEmpty 而不是检查 null 和空字符串。
  5. 通过声明 oldNamenewName,您可以仅在确实为真时将列名称跟踪为已修剪。

此外,如果您只将值 01 分配给 trimmed 变量,那么您应该考虑声明它作为 bool 并分配 falsetrue。 否则,您可以将 trimmed 变量保留为数字,但增加其值而不是始终分配相同的常量 (1).

如果您要更改的不是列名,而是该列当前行中的单元格值,那么您将无法获取(并稍后设置)单元格值(您正在评估和尝试仅更改列名)。 在这种情况下,内循环代码变为:

var oldValue = row[column] as string;
if (!string.IsNullOrEmpty(oldValue))
{
    var newValue = oldValue.Trim();
    if (newValue != oldValue)
    {
        row[column] = newValue;
        trimmed = 1;
    }
}