如何编辑 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];
}
你的代码有两个错误:
- 您正在使用 foreach 迭代序列并尝试修改迭代项;因此,抛出异常。
- 您正在尝试替换列对象而不是其名称。
此外,您正在滥用 ToString,并且正如 Michal Turczyn 所述,您没有使用明确设计用于测试空字符串或空字符串的内置 String 方法。
您可以尝试将内循环中的代码替换为
var oldName = column.ColumnName;
if (!string.IsNullOrEmpty(oldName))
{
var newName = oldName.Trim();
if (newName != oldName)
{
column.ColumnName = newName;
trimmed = 1;
}
}
从这个替换代码可以看出:
- 你应该 read/write
ColumnName
属性 而不是 ToString
.
- 您可以通过使用
Trim
. 来避免一个接一个(以任何顺序)调用 TrimStart
和 TrimEnd
- 您应该使用
string.IsNullOrEmpty
而不是检查 null 和空字符串。
- 通过声明
oldName
和 newName
,您可以仅在确实为真时将列名称跟踪为已修剪。
此外,如果您只将值 0 和 1 分配给 trimmed
变量,那么您应该考虑声明它作为 bool
并分配 false 或 true。
否则,您可以将 trimmed
变量保留为数字,但增加其值而不是始终分配相同的常量 (1).
如果您要更改的不是列名,而是该列当前行中的单元格值,那么您将无法获取(并稍后设置)单元格值(您正在评估和尝试仅更改列名)。
在这种情况下,内循环代码变为:
var oldValue = row[column] as string;
if (!string.IsNullOrEmpty(oldValue))
{
var newValue = oldValue.Trim();
if (newValue != oldValue)
{
row[column] = newValue;
trimmed = 1;
}
}
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];
}
你的代码有两个错误:
- 您正在使用 foreach 迭代序列并尝试修改迭代项;因此,抛出异常。
- 您正在尝试替换列对象而不是其名称。
此外,您正在滥用 ToString,并且正如 Michal Turczyn 所述,您没有使用明确设计用于测试空字符串或空字符串的内置 String 方法。
您可以尝试将内循环中的代码替换为
var oldName = column.ColumnName;
if (!string.IsNullOrEmpty(oldName))
{
var newName = oldName.Trim();
if (newName != oldName)
{
column.ColumnName = newName;
trimmed = 1;
}
}
从这个替换代码可以看出:
- 你应该 read/write
ColumnName
属性 而不是ToString
. - 您可以通过使用
Trim
. 来避免一个接一个(以任何顺序)调用 - 您应该使用
string.IsNullOrEmpty
而不是检查 null 和空字符串。 - 通过声明
oldName
和newName
,您可以仅在确实为真时将列名称跟踪为已修剪。
TrimStart
和 TrimEnd
此外,如果您只将值 0 和 1 分配给 trimmed
变量,那么您应该考虑声明它作为 bool
并分配 false 或 true。
否则,您可以将 trimmed
变量保留为数字,但增加其值而不是始终分配相同的常量 (1).
如果您要更改的不是列名,而是该列当前行中的单元格值,那么您将无法获取(并稍后设置)单元格值(您正在评估和尝试仅更改列名)。 在这种情况下,内循环代码变为:
var oldValue = row[column] as string;
if (!string.IsNullOrEmpty(oldValue))
{
var newValue = oldValue.Trim();
if (newValue != oldValue)
{
row[column] = newValue;
trimmed = 1;
}
}