Работа с dataGridView
1. Как перенести всю информацию из dataGridView1
в массив структур.
Для начала, после строки namespace ... (в самом верху), объявим массив структур:
struct mas{
char *a, *d;
double c;
};
mas p[10]; //т.е. dataGridView1 должна содержать 3 колонки и не более 11 строк
//Третья колонка содержит только вещественные числа, тип char не вводить!!!
Если разбираться в том, что такое массив структур, то наглядно изобразить его можно так:
Как добавить 3 колонки: Свойства dataGridView -> Коллекция (Columns) ... -> Добавить.
Теперь займемся переводом информации в массив.
using namespace System::Runtime::InteropServices; //для Marshal
for (int i = 0; i < dataGridView1->RowCount-1; i++){
p[i].a = (char*)(void*)Marshal::StringToHGlobalAnsi(dataGridView1[0, i]->Value->ToString());
p[i].d = (char*)(void*)Marshal::StringToHGlobalAnsi(dataGridView1[1, i]->Value->ToString());
p[i].c = Convert::ToDouble(dataGridView1[2, i]->Value->ToString());
}
Выражение (char*)(void*)Marshal::StringToHGlobalAnsi(...)
переводит строку из String^
в char*
.
Теперь массив структур заполнен.
2. Как вывести информацию из массива структур в dataGridView2
.
for (int t = 0; t < dataGridView1->RowCount-1; t++){
dataGridView2->Rows->Add(); //добавляет строку
dataGridView2[0, t]->Value = gcnew String(p[t].a);
dataGridView2[1, t]->Value = gcnew String(p[t].d);
dataGridView2[2, t]->Value = Convert::ToString(p[t].c);
}
3. Проверить, все ли ячейки каждой строки заполнены (в случае незаполнения ошибка!).
Для нашей dataGridView
с тремя колонками:
bool u = true;
for(int i = 0; i < dataGridView1->RowCount-1; i++){
for(int j = 0; j < 3; j++){
if(dataGridView1[j,i]->Value == nullptr){
u = false;
break;
}
}
}
//nullptr в случае пустой ячейки
В случае нахождения пустой ячейки u = false
.
Т.е. пункт 1 нужно написать так:
if(u){
for (int i = 0; i < dataGridView1->RowCount-1; i++){
p[i].a = (char*)(void*)Marshal::StringToHGlobalAnsi(dataGridView1[0, i]->Value->ToString());
p[i].d = (char*)(void*)Marshal::StringToHGlobalAnsi(dataGridView1[1, i]->Value->ToString());
p[i].c = Convert::ToDouble(dataGridView1[2, i]->Value->ToString());
}
}
Теперь ошибки не будет.