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 [11234 просмотра]