Как заполнить datarow-> ItemArray из DataGridView?

Я пытаюсь заполнить мой DataTable со значениями из DataGridView,

Код:

Data::DataTable^ dataTable = gcnew Data::DataTable;
int rows = dataGridView1->RowCount;
int cols = dataGridView1->ColumnCount;
for (int iZeilen= 0; iZeilen < rows; iZeilen++ ){
Data::DataRow^ row = dataTable->Rows->Add() ;
row->ItemArray[dataGridView1->RowCount];
for (int iSpalten= 1; iSpalten = cols; iSpalten++) {
row->ItemArray[iSpalten] = (dataGridView1[iZeilen, iSpalten]) ;
}
dataTable->Rows->Add(row);
}

У компилятора нет проблем, но во время выполнения возникает исключение, которое говорит:

Индекс находится вне диапазона массива

В соответствии:

row->ItemArray[iSpalten] = (dataGridView1[iZeilen, iSpalten]) ;

Может кто-нибудь сказать мне, какой массив подразумевается?

0

Решение

Здесь происходит несколько проблем.

  1. Ваш вложенный цикл выйдет только если row->ItemArray[iSpalten] вне диапазона. В противном случае это никогда не закончится, потому что ваш условный оператор является присваиванием: iSpalten = cols, Вероятно, простая ошибка или ошибка копирования-вставки. Если dataGridView1 имеет больше столбцов, чем строк, вы получите именно ту ошибку, которая у вас есть.

Пример:

Data::DataTable^ dataTable = gcnew Data::DataTable;
int rows = dataGridView1->RowCount;                            // Let's say this is 3.
int cols = dataGridView1->ColumnCount;                         // Let's say this is 5.

for (int iZeilen= 0; iZeilen < rows; iZeilen++ )
{
Data::DataRow^ row = dataTable->Rows->Add();
row->ItemArray[dataGridView1->RowCount];                   // 3 items in row->ItemArray

for (int iSpalten= 1; iSpalten = cols; iSpalten++)         // iSpalten = 5, always.
{
row->ItemArray[iSpalten] = (dataGridView1[iZeilen, iSpalten]); // Access row->ItemArray[5] = error, index out of range
}
dataTable->Rows->Add(row);
}
  1. Хотя это не связано с вашей ошибкой во время выполнения, вы обнаружите, что ваша таблица данных заполнена не так, как вам бы хотелось. При доступе к массивам массив [row, col] обычно корректен. Но для DataGridView все наоборот: dgv [col, row]. Так что эта строка row->ItemArray[iSpalten] = (dataGridView1[iZeilen, iSpalten]); должно быть на самом деле row->ItemArray[iSpalten] = (dataGridView1[iSpalten, iZeilen]);, Я не знаю, почему это соглашение для dgv, и мне это не нравится, но это то, что есть.

  2. Эта линия row->ItemArray[dataGridView1->RowCount]; должно быть row->ItemArray[dataGridView1->ColumnCount]; потому что вы добавляете все значения одной строки dgv в одну строку таблицы данных. Это означает, что у него есть пункт для каждого столбца.

Это должно дать вам результаты, которые вы хотите. Надеюсь, поможет.

0

Другие решения