Как добавить пользовательский элемент управления во время выполнения в C#
У меня есть один список, который имеет кнопку, текстовое поле, метку. Во время выполнения я буду перетаскивать элемент из списка, в зависимости от выбора будет создан динамический элемент управления. (Например, если я выберу и перетащу кнопку из списка и перетащу ее в форму Windows, кнопка будет создана). Так же, как я создал CustomControl для кнопки. Как я могу добавить его в моем списке во время выполнения? Я имею в виду, что при перетаскивании кнопки из списка должна быть сгенерирована пользовательская кнопка. Как это сделать?
2 ответа
Для перетаскивания вам нужно настроить 3 события:
Событие мыши вниз в списке, чтобы вызвать перетаскивание:
private void listBox1_MouseDown(object sender, MouseEventArgs e) { listBox1.DoDragDrop(listBox1.SelectedItem, DragDropEffects.Copy); }
Событие перетаскивания ввода в вашей форме (или панели в этом примере):
private void panel1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effect = DragDropEffects.Copy; } }
И, наконец, событие drop на форме / панели:
private void panel1_DragDrop(object sender, DragEventArgs e) { Control newControl = null; // you would really use a better design pattern to do this, but // for demo purposes I'm using a switch statement string selectedItem = e.Data.GetData(DataFormats.Text) as string; switch (selectedItem) { case "My Custom Control": newControl = new CustomControl(); newControl.Location = panel1.PointToClient(new Point(e.X, e.Y)); newControl.Size = new System.Drawing.Size(75, 23); break; } if (newControl != null) panel1.Controls.Add(newControl); }
Чтобы это работало, вы должны установить "AllowDrop" в true на целевой форме / панели.
Используйте ответ @Marty, чтобы добавить пользовательский элемент управления в список. Переопределить ToString()
для лучшего описания. Есть так много способов сделать это. Важная часть заключается в том, чтобы решить, каким типом данных будут элементы списка, и убедиться, что в имени используется правильное имя типа. e.Data.GetDataPresent
метод. e.Data.GetFormats()
может помочь определить, какое имя использовать.
Ты пробовал это?
var list = new ListBox();
list.Controls.Add(new Button());
Если вам нужно динамически создать класс во время выполнения - взгляните на эту статью SF. Как динамически создать класс в C#?