БлогNot. Visual C++: основные действия над строками и столбцами таблицы DataGridView

Visual C++: основные действия над строками и столбцами таблицы DataGridView

В дополнение к примерам на табличные компоненты (1, 2) покажем работу со строками и столбцами таблицы DataGridView, в частности, их добавление и удаление плюс "сбор" информации из ячеек таблицы.

вид формы приложения в конструкторе
вид формы приложения в конструкторе

На рисунке показана форма примера, её можно сделать так:

  • создав приложение Windows Forms, перетащим в окно формы компоненту TableLayoutPanel, установим ей свойство Dock=Fill и из меню задач компоненты (треугольничек вверху справа) выберем "Удалить последнюю строку", потом "Правка строк и столбцов".
  • В список "Строки" добавим 5 строк, каждой из них установим одинаковый абсолютный размер в пикселах, например, 33.
  • В списке "Столбцы" у первого столбца установлен абсолютный размер в пикселах, например, 100, у второго - относительный размер 100%.
  • В правую верхнюю ячейку получившейся сетки 5x2 перетащим компоненту DataGridView и установим ей свойства RowSpan = 5 и Dock = Fill.
  • В каждую из пяти левых ячеек перетащим по кнопке Button, каждой из кнопок установим свойство Anchor = Top, Left, Right и подпишем их, изменив свойство Text.

Нам понадобится обработать только нажатия пяти кнопок, поскольку "ручной" ввод данных в таблицу разрешён по умолчанию.

При добавлении строки сначала сформируем её программно, установив также заголовок строки HeaderCell и настроив его ширину RowHeadersWidth.

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) { //добавить строку
 if (!dataGridView1->ColumnCount) { MessageBox::Show("Сначала добавьте столбцы!"); return; }
 DataGridViewRow ^r = gcnew DataGridViewRow();
 r->HeaderCell->Value = "Строка " + dataGridView1->RowCount;
 r->CreateCells(dataGridView1);
 array <String ^> ^Values = gcnew array <String ^>(dataGridView1->ColumnCount);
 for (int j = 0; j < dataGridView1->ColumnCount; j++)
  Values[j] = "Значение "+ dataGridView1->RowCount +","+(j+1);
 r->SetValues(Values);
 dataGridView1->Rows->Add(r);
 dataGridView1->RowHeadersWidth = 100;
}

Добавление столбца выполняется аналогично, столбцу назначен формат CellTemplate для ввода текста в ячейку.

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) { //добавить столбец
 DataGridViewColumn ^c = gcnew DataGridViewColumn();
 DataGridViewCell ^td = gcnew DataGridViewTextBoxCell(); //нельзя создать "абстрактную" DataGridViewCell
 c->HeaderText = "Столбец " + (dataGridView1->ColumnCount + 1);
 c->Name = "Column"+ (dataGridView1->ColumnCount + 1);
 c->CellTemplate = td; //назначаем шаблон для ячейки, в нашем случае - ввод текста
 //dataGridView1->SelectionMode = DataGridViewSelectionMode::CellSelect;
 dataGridView1->Columns->Add(c);
}

При удалении строки учтём возможные исключения, возникающие, если нет выделенной строки или предпринята попытка удалить последнюю оставшуюся пустую строку.

private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) { //удалить строку
 if (!dataGridView1->RowCount) { MessageBox::Show("В таблице нет строк!"); return; }
 if (dataGridView1->SelectedRows->Count>0) {
  for (int i=0; i<dataGridView1->SelectedRows->Count; i++) {
   int index = dataGridView1->SelectedRows[i]->Index;
  	try { dataGridView1->Rows->RemoveAt(index);	}
	  catch (...) { MessageBox::Show("Не могу удалить строку с индексом " + index); }
  }
 }
 else {
  int index;
  try { index = dataGridView1->CurrentCell->RowIndex; } catch (...) {}
  if (index != -1) {
   try { dataGridView1->Rows->RemoveAt(index); }
   catch (...) { MessageBox::Show("Не могу удалить строку с индексом " + index); }
  }
  else	MessageBox::Show("Выберите строки/ячейку для удаления");
 }
}

Удаление столбца выполним с аналогичными проверками.

private: System::Void button5_Click(System::Object^  sender, System::EventArgs^  e) { //удалить столбец
 if (!dataGridView1->ColumnCount) { MessageBox::Show("В таблице нет столбцов!"); return; }
 if (dataGridView1->SelectedColumns->Count>0) {
  for (int i = 0; i<dataGridView1->SelectedColumns->Count; i++) {
	  int index = dataGridView1->SelectedColumns[i]->Index;
	  try { dataGridView1->Columns->RemoveAt(index); }
	  catch (...) { MessageBox::Show("Не могу удалить столбец с индексом " + index); }
  }
 }
 else {
  int index; 
  try { index = dataGridView1->CurrentCell->ColumnIndex; } catch (...) {}
  if (index != -1) {
   try { dataGridView1->Columns->RemoveAt(index); }
   catch (...) { MessageBox::Show("Не могу удалить столбец с индексом " + index); }
  }
  else MessageBox::Show("Выберите столбцы для удаления");
 }
}

Наконец, по нажатию кнопки "Действие" вставим код, формирующий строку со всеми данными таблицами. При этом величины из соседних ячеек строки разделены табуляциями, а между строками вставлен символ перевода строки. Сформированная строка Data просто оnображается в окне диалога MessageBox.

private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) { 
 //получить текст таблицы в строку
 String ^Data = gcnew String(""); 
 for (int i = 0; i < dataGridView1->RowCount; i++) {
  for (int j = 0; j < dataGridView1->ColumnCount; j++) {
   Object ^val = dataGridView1->Rows[i]->Cells[j]->Value;
   if (val) Data += val->ToString();
   Data += "\t";
  }
  Data += "\n";
 }
 MessageBox::Show(Data);
}

 Архив .zip с этим проектом Studio 2015, развернуть, не создавая новой папки (8 Кб)

Если надо, в опциях проекта поменяйте платформу решения с x64 на x86 (список на стандартной панели).

 Пример из MSDN на DataGridView

22.11.2017, 11:05 [10680 просмотров]


теги: программирование c++/cli

показать комментарии (1)