Как добавить строки в середину TableLayoutPanel - PullRequest
5 голосов
/ 01 ноября 2011

У меня есть TableLayoutPanel с 3 столбцами и 1 строкой: (Кнопка «Удалить», «Контроль пользователя», «Добавить»)

Я хочу, чтобы кнопка Добавить добавила новую строку, аналогичную приведенной выше, под нажатой кнопкой: например: ДО:

  1. (Удалить кнопку 1, пользовательский элемент управления 2, добавить кнопку 1)
  2. (Удалить кнопку 2, Пользовательский контроль 2, Добавить кнопку 2)

После нажатия «Добавить кнопку 1»:

  1. (Удалить кнопку 1, пользовательский элемент управления 2, добавить кнопку 1)
  2. (Удалить кнопку 3, пользовательский элемент управления 3, добавить кнопку 3)
  3. (Удалить кнопку 2, Пользовательский контроль 2, Добавить кнопку 2)

Мне удалось добавить строку в конец таблички, но не посередине: она продолжает портить компоновку. Вот фрагмент обработчика события:

void MySecondControl::buttonAdd_Click( System::Object^ sender, System::EventArgs^ e )
{
   int rowIndex = 1 + this->tableLayoutPanel->GetRow((Control^)sender);

   /* Remove button */
   Button^ buttonRemove = gcnew Button();
   buttonRemove->Text = "Remove";
   buttonRemove->Click += gcnew System::EventHandler(this, &MySecondControl::buttonRemove_Click);

   /* Add button */
   Button^ buttonAdd = gcnew Button();
   buttonAdd->Text = "Add";
   buttonAdd->Click += gcnew System::EventHandler(this, &MySecondControl::buttonAdd_Click);

   /*Custom user control */
   MyControl^ myControl = gcnew MyControl();

   /* Add the controls to the Panel. */
   this->tableLayoutPanel->RowCount += 1;
   this->tableLayoutPanel->Controls->Add(buttonRemove, 0, rowIndex);
   this->tableLayoutPanel->Controls->Add(myControl, 1, rowIndex);
   this->tableLayoutPanel->Controls->Add(buttonAdd, 2, rowIndex);
}

Это не работает должным образом.

Я что-то не так делаю? есть предложения?

1 Ответ

6 голосов
/ 06 ноября 2011

Наконец-то нашел решение: вместо добавления элементов управления к их прямому расположению я добавляю их в конец, а затем использую функцию SetChildIndex() для перемещения элемента управления в нужное место:

void MySecondControl::buttonAdd_Click( System::Object^ sender, System::EventArgs^ e )
{
   int childIndex = 1 + this->tableLayoutPanel->Controls->GetChildIndex((Control^)sender);

   /* Remove button */
   Button^ buttonRemove = gcnew Button();
   buttonRemove->Text = "Remove";
   buttonRemove->Click += gcnew System::EventHandler(this, &MySecondControl::buttonRemove_Click);

   /* Add button */
   Button^ buttonAdd = gcnew Button();
   buttonAdd->Text = "Add";
   buttonAdd->Click += gcnew System::EventHandler(this, &MySecondControl::buttonAdd_Click);

   /*Custom user control */
   MyControl^ myControl = gcnew MyControl();

   /* Add the controls to the Panel. */
   this->tableLayoutPanel->Controls->Add(buttonRemove);
   this->tableLayoutPanel->Controls->Add(myControl);
   this->tableLayoutPanel->Controls->Add(buttonAdd);

   /* Move the controls to the desired location */
   this->tableLayoutPanel->Controls->SetChildIndex(buttonRemove, childIndex);
   this->tableLayoutPanel->Controls->SetChildIndex(myControl, childIndex + 1);
   this->tableLayoutPanel->Controls->SetChildIndex(buttonAdd, childIndex + 2);
}
...