如何在c#中的运行时添加自定义控件

时间:2016-01-21 10:56:49

标签: c# windows-applications

我有一个列表框,其中包含按钮,文本框,标签。在运行期间,我将从列表框中拖放项目,根据选择将创建动态控件。 (例如,如果我从列表框中选择并拖动按钮并将其放在Windows窗体上,则会创建该按钮)。就像我为Button创建了CustomControl一样。如何在运行时将其添加到列表框中?我的意思是,当我从列表框中拖放按钮时,应该生成自定义按钮。怎么做?

2 个答案:

答案 0 :(得分:1)

你尝试过这个吗?

var list = new ListBox();
list.Controls.Add(new Button());

如果您需要在运行时动态创建类 - 请查看此SF文章How to dynamically create a class in C#?

答案 1 :(得分:0)

对于拖放,您需要设置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);
    }
    
  4. 为此,您必须设置" AllowDrop"在目标表格/面板上为真。

    使用@ Marty的答案将自定义控件添加到列表框中。覆盖ToString()以获得更好的说明。有很多方法可以做到这一点。重要的部分是确定列表项的数据类型,并确保在e.Data.GetDataPresent方法中使用正确的类型名称。 e.Data.GetFormats()可以帮助确定要使用的名称。