Как редактировать значение столбца DataTable - PullRequest
0 голосов
/ 17 апреля 2020

Имя столбца Excel может содержать конечные пробелы, которые могут вызвать исключение, если столбец не совпадает из-за пробелов.

Я нахожу способы обработки конечных пробелов в имени столбца в datatable.

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 Ответ

0 голосов
/ 17 апреля 2020

В вашем коде есть две ошибки:

  1. Вы повторяете последовательность с помощью foreach и пытаетесь изменить повторяющиеся элементы; таким образом, исключение, которое выдает.
  2. Вы пытаетесь заменить объект столбца вместо его имени.

Кроме того, вы используете ToString и, как уже было указано Michal Turczyn , вы не используете встроенные методы String, явно предназначенные для проверки пустых или нулевых строк.

Вы можете попробовать заменить код внутри l oop на

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

Из этого кода замены Вы можете видеть, что:

  1. Вы должны читать / писать ColumnName свойство вместо использования ToString.
  2. Вы можете избежать вызова TrimStart и TrimEnd один за другим (в любом порядке) с помощью Trim.
  3. Вы должны использовать string.IsNullOrEmpty вместо проверки на наличие пустой нулевой строки.
  4. Объявляя oldName и newName, вы можете отслеживать имя столбца как усеченное, только если это действительно так.

Более того, если вы назначаете только значения 0 и 1 От до trimmed, тогда вы должны рассмотреть возможность объявления его как bool и присвойте false или true . В противном случае вы можете сохранить trimmed переменную как число, но увеличивая ее значение, а не присваивать всегда одну и ту же константу (1).

Если то, что вы пытаетесь изменить, это не имя столбца, а ячейка значение в текущей строке для такого столбца, то вам не хватает получить (и позже установить) значение ячейки (вы оцениваете и пытаетесь изменить только имя столбца). В этом случае внутренний код l oop становится:

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