Работа с dataGridView

C++ / CLI Windows Forms
30.11.-0001

(Всего голосов: 1)

  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());
                              }
                           }

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


Оставить комментарий