Как добавить строки в середину табличной панели

#winforms #user-controls #tablelayoutpanel

#winforms #пользовательские элементы управления #табличная панель

Вопрос:

У меня есть панель 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, amp;MySecondControl::buttonRemove_Click);

   /* Add button */
   Button^ buttonAdd = gcnew Button();
   buttonAdd->Text = "Add";
   buttonAdd->Click  = gcnew System::EventHandler(this, amp;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:

Наконец-то найдено решение: вместо добавления элементов управления в их прямое местоположение я добавляю их в конец, а затем использую 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, amp;MySecondControl::buttonRemove_Click);

   /* Add button */
   Button^ buttonAdd = gcnew Button();
   buttonAdd->Text = "Add";
   buttonAdd->Click  = gcnew System::EventHandler(this, amp;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);
}
 

Комментарии:

1. 1 Большое спасибо за то, что поделился, Эльдад! У меня была ТОЧНО такая же проблема. Просто не имело никакого смысла, почему добавление элементов в начале и в конце коллекции работало, но не удалось нигде между началом и концом… SetChildIndex не только отнял много кода, но и работает как шарм 🙂 еще раз спасибо!