Назначение DataTable ItemArray не работает

Я уверен, что это тривиально, но это был долгий день.

У меня есть DataTable, в одной строке которого есть пустая ячейка. Я хочу найти строку с пустой ячейкой и просто присвоить строку значению этой ячейки.

Однако, когда я просматриваю код во время отладки, значение никогда не вставляется в таблицу. Что я делаю не так???

currentTime = DateTime.Now.ToString();

for (int i = 0; i < OwnersTable.Rows.Count; i++)
    if (OwnersTable.Rows[i].ItemArray[9].ToString() == "")
        OwnersTable.Rows[i].ItemArray[9] = currentTime;

Я обнаружил, что для этого мне пришлось создать совершенно новую строку, скопировать содержимое каждой ячейки существующей строки, а затем добавить ее обратно в таблицу. Что???
Почему в приведенном выше коде не работает простое назначение ячеек????


person gh0st    schedule 06.05.2015    source источник


Ответы (3)


Получатель DataRow .ItemArray возвращает массив, содержащий целые значения для строки, изменение его элементов не приводит к изменению значений строки.

Получает или задает все значения для этой строки через массив.

Поэтому вам нужно вместо этого присвоить ему массив (используйте сеттер), но я не рекомендую этот способ:

currentTime = DateTime.Now.ToString();

for (int i = 0; i < OwnersTable.Rows.Count; i++) {
    object[] items = OwnersTable.Rows[i].ItemArray;         
    if (items[9].ToString() == string.Empty) {            
        items[9] = currentTime
        OwnersTable.Rows[i].ItemArray = items;
    }
}

Вы можете использовать SetField метод DataRow:

currentTime = DateTime.Now.ToString();
foreach (DataRow row in OwnersTable.Rows) {
    string value = row.Field<string>(9);
    if (string.IsNullOrEmpty(value)) {            
        row.SetField<string>(9, currentTime) 
    }
}

Обратите внимание, что я предположил, что поле имеет строковый тип.

person Mehrzad Chehraz    schedule 06.05.2015
comment
Где вы придумали эти методы Field и SetField? - person gh0st; 07.05.2015
comment
Что ты имеешь в виду? извините, я не так хорош в английском :D - person Mehrzad Chehraz; 07.05.2015
comment
Все нормально. Следуя вашему предложению row.Field и row.SetField, я получаю следующие ошибки. Error 27 'object' does not contain a definition for 'SetField' Error 25 'object' does not contain a definition for 'Field' - person gh0st; 07.05.2015
comment
Я обновил ответ. Это потому, что я использовал var вместо DataRow. - person Mehrzad Chehraz; 07.05.2015

Только что наткнулся на этот пост после того, как столкнулся с той же проблемой. Более прямой способ сделать это, который позволяет обойти проблему ItemArray, о которой упоминает Мехрзад, заключается в проверке и присвоении значений с использованием row[columnIndex] везде, где используется row.ItemArray[columnIndex]. Прямой индексатор строки не ссылается на копию данных строки. Код становится:

for (int i = 0; i < OwnersTable.Rows.Count; i++)

if (OwnersTable.Rows[i][9].ToString() == "") OwnersTable.Rows[i][9] = currentTime;

person Steve Rehling    schedule 24.04.2019

Я столкнулся с той же проблемой. Очевидно, вам не нужно ключевое слово ItemArray при присвоении значения.

Поэтому вместо OwnersTable.Rows[i].ItemArray[9] = currentTime;

Вы можете использовать OwnersTable.Rows[i][9] = currentTime;

person Swanand Nalawade    schedule 31.03.2020