Я пытаюсь заполнить мой 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]) ;
Может кто-нибудь сказать мне, какой массив подразумевается?
Здесь происходит несколько проблем.
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);
}
Хотя это не связано с вашей ошибкой во время выполнения, вы обнаружите, что ваша таблица данных заполнена не так, как вам бы хотелось. При доступе к массивам массив [row, col] обычно корректен. Но для DataGridView все наоборот: dgv [col, row]. Так что эта строка row->ItemArray[iSpalten] = (dataGridView1[iZeilen, iSpalten]);
должно быть на самом деле row->ItemArray[iSpalten] = (dataGridView1[iSpalten, iZeilen]);
, Я не знаю, почему это соглашение для dgv, и мне это не нравится, но это то, что есть.
Эта линия row->ItemArray[dataGridView1->RowCount];
должно быть row->ItemArray[dataGridView1->ColumnCount];
потому что вы добавляете все значения одной строки dgv в одну строку таблицы данных. Это означает, что у него есть пункт для каждого столбца.
Это должно дать вам результаты, которые вы хотите. Надеюсь, поможет.