#winforms #user-controls #tablelayoutpanel
#winforms #пользовательские элементы управления #табличная панель
Вопрос:
У меня есть панель TableLayoutPanel с 3 столбцами и 1 строкой: (Кнопка удаления, пользовательский элемент управления, кнопка добавления)
Я хочу, чтобы кнопка Добавления добавляла новую строку, аналогичную приведенной выше, под нажатой кнопкой: например: ПЕРЕД:
- (Удалить кнопку 1, пользовательский элемент управления 2, Добавить кнопку 1)
- (Удалить кнопку 2, Пользовательский элемент управления 2, Добавить кнопку 2)
После нажатия «Добавить кнопку 1»:
- (Удалить кнопку 1, пользовательский элемент управления 2, Добавить кнопку 1)
- (Удалить кнопку 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 не только отнял много кода, но и работает как шарм 🙂 еще раз спасибо!