我有一个列表框,其中包含按钮,文本框,标签。在运行期间,我将从列表框中拖放项目,根据选择将创建动态控件。 (例如,如果我从列表框中选择并拖动按钮并将其放在Windows窗体上,则会创建该按钮)。就像我为Button创建了CustomControl一样。如何在运行时将其添加到列表框中?我的意思是,当我从列表框中拖放按钮时,应该生成自定义按钮。怎么做?
答案 0 :(得分:1)
var list = new ListBox();
list.Controls.Add(new Button());
如果您需要在运行时动态创建类 - 请查看此SF文章How to dynamically create a class in C#?
答案 1 :(得分:0)
对于拖放,您需要设置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"在目标表格/面板上为真。
使用@ Marty的答案将自定义控件添加到列表框中。覆盖ToString()
以获得更好的说明。有很多方法可以做到这一点。重要的部分是确定列表项的数据类型,并确保在e.Data.GetDataPresent
方法中使用正确的类型名称。 e.Data.GetFormats()
可以帮助确定要使用的名称。