Как добавить пользовательский элемент управления во время выполнения в C#

У меня есть один список, который имеет кнопку, текстовое поле, метку. Во время выполнения я буду перетаскивать элемент из списка, в зависимости от выбора будет создан динамический элемент управления. (Например, если я выберу и перетащу кнопку из списка и перетащу ее в форму Windows, кнопка будет создана). Так же, как я создал CustomControl для кнопки. Как я могу добавить его в моем списке во время выполнения? Я имею в виду, что при перетаскивании кнопки из списка должна быть сгенерирована пользовательская кнопка. Как это сделать?

2 ответа

Решение

Для перетаскивания вам нужно настроить 3 события:

  1. Событие мыши вниз в списке, чтобы вызвать перетаскивание:

    private void listBox1_MouseDown(object sender, MouseEventArgs e)
    {
        listBox1.DoDragDrop(listBox1.SelectedItem, DragDropEffects.Copy);
    }
    
  2. Событие перетаскивания ввода в вашей форме (или панели в этом примере):

    private void panel1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.Text))
        {
            e.Effect = DragDropEffects.Copy;
        }
    }
    
  3. И, наконец, событие 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#?

Другие вопросы по тегам