Работа с dataGridView
×

Работа с 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());
   }
}

Теперь ошибки не будет.