c#可以创建任意控件的拖动方法

yizhihongxing
  1. 标准的拖放流程
    首先,需要在窗体上放置一个容器控件,比如Panel或者GroupBox,在这个容器控件上,就可以进行拖放了,具体的代码流程如下:
private void panel1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Button)))
        e.Effect = DragDropEffects.Move;
    else
        e.Effect = DragDropEffects.None;
}

private void panel1_DragDrop(object sender, DragEventArgs e)
{
    Button btn = e.Data.GetData(typeof(Button)) as Button;
    if (btn != null)
    {
        this.panel1.Controls.Add(btn);
        btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
    }
}

这里我们使用Panel作为容器控件,可以看到,当鼠标进入控件区域时,会触发DragEnter事件,我们可以在这个事件中判断拖入的数据类型是否为Button类型,如果是,则设置拖放效果为Move,否则为None;当鼠标放开时,会触发DragDrop事件,我们可以从数据中获取被拖动的控件,然后将其添加到容器中,设置其位置为鼠标放开的位置。

  1. 动态创建控件并实现拖放
    除了容器控件,我们也可以动态创建控件,然后实现拖放,代码如下:
private void button1_MouseDown(object sender, MouseEventArgs e)
{
    Button btn = new Button();
    btn.Text = "New Button";
    btn.Size = new System.Drawing.Size(80, 30);
    btn.BackColor = Color.LightBlue;
    btn.MouseDown += new MouseEventHandler(Button_MouseDown);
    this.Controls.Add(btn);
    btn.DoDragDrop(btn, DragDropEffects.Move);
}

private void Button_MouseDown(object sender, MouseEventArgs e)
{
    Button btn = sender as Button;
    if (e.Button == MouseButtons.Left)
        btn.DoDragDrop(btn, DragDropEffects.Move);
}

private void panel1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Button)))
        e.Effect = DragDropEffects.Move;
    else
        e.Effect = DragDropEffects.None;
}

private void panel1_DragDrop(object sender, DragEventArgs e)
{
    Button btn = e.Data.GetData(typeof(Button)) as Button;
    if (btn != null)
    {
        btn.Parent.Controls.Remove(btn);
        this.panel1.Controls.Add(btn);
        btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
    }
}

这里,我们在Button的MouseDown事件中添加了拖放事件,当鼠标按下后,会创建一个控件,并将其设置为数据源,然后进行拖放操作。在拖放目标容器的DragDrop事件中,同样可以获取到被拖动的控件,然后将其从原来的容器中移除,添加到拖放目标容器中。这里需要注意的是,添加控件的时候,需要将其Parent设置为目标容器。

以上是c#创建任意控件的拖动方法的核心代码,具体的实现方式可以根据需求进行扩展和变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#可以创建任意控件的拖动方法 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Windows 2012 r2系统上安装IIS 8.0的方法(图文)

    下面是详细的攻略: Windows 2012 r2系统上安装IIS 8.0的方法(图文) 前言 IIS是微软的Web服务器,它可以将Web站点和Web应用程序托管在Windows服务器上。本文将介绍在Windows Server 2012 R2上安装IIS 8.0的详细步骤。 准备工作 在进行IIS 8.0的安装前,我们需要确保系统已经安装了.NET Fra…

    other 2023年6月27日
    00
  • 微软Excel如何自定义菜单和工具栏

    自定义菜单和工具栏使得用户可以快速访问常用的Excel功能和命令,提高工作效率。下面是自定义菜单和工具栏的详细步骤: 步骤1:打开“自定义工具栏和菜单”窗口 在Excel的工具菜单栏中选择“自定义工具栏和菜单”,或者使用快捷键“Alt+T, O”打开“自定义工具栏和菜单”窗口。 步骤2:新建自定义菜单或工具栏 在“自定义工具栏和菜单”窗口中选择“新建自定义菜…

    other 2023年6月25日
    00
  • Adobe CS5(Photoshop CS5/Flash CS5)真正官方简体中文完全版 官方下载地址

    Adobe CS5(Photoshop CS5/Flash CS5)真正官方简体中文完全版 官方下载地址攻略 简介 Adobe CS5是Adobe公司推出的一套集成了多个专业设计和开发工具的软件套装,其中包括Photoshop CS5和Flash CS5。本攻略将详细介绍如何获取Adobe CS5的真正官方简体中文完全版,并提供官方下载地址。 步骤 步骤一:…

    other 2023年8月4日
    00
  • php根据命令行参数生成配置文件详解

    PHP根据命令行参数生成配置文件详解 许多应用程序有一个配置文件,这个文件包含了应用程序的各种设置和选项。这个文件可以手动编写,但是如果应用程序有很多选项或者需要在不同的环境中运行,手动编写会变得非常困难。 在PHP中,我们可以使用命令行参数来生成配置文件。这使得应用程序更加灵活,可以在不同的环境中轻松运行。以下是如何使用PHP来生成配置文件的详细攻略。 步…

    other 2023年6月25日
    00
  • jupyter修改文件名方式(TensorFlow)

    Jupyter修改文件名方式(TensorFlow)的完整攻略 在Jupyter中,修改文件名常常是我们所需要的操作之一。修改TensorFlow文件名则具有一定难度,因此需要特殊的方法。本篇攻略将给出如何在Jupyter中修改TensorFlow文件名的具体操作。 步骤一:打开Jupyter 首先需要在本地环境中,打开Jupyter。可以通过Anacond…

    other 2023年6月26日
    00
  • Asp.net自定义控件之单选、多选控件

    Asp.net自定义控件之单选、多选控件 在ASP.NET中,我们可以使用自定义控件来实现复杂的功能和界面。其中单选和多选控件是非常常用的控件,我们可以通过自定义控件的方式来实现它们的功能。 创建自定义控件 我们可以通过继承WebControl类来创建自定义控件。以下是单选、多选控件的基础结构: public class RadioButtonList : …

    other 2023年6月27日
    00
  • 浅谈数据库日期类型字段设计应该如何选择

    当我们设计数据库时,日期类型字段是一个必不可少的部分。但是,在选择日期类型字段时,我们应该考虑哪些因素?本篇攻略就会详细的讲解如何选择日期类型字段的设计。 选项 在SQL数据库中,通常有三种类型的日期字段: 日期类型(DATE):仅存储年、月和日期. 时间类型(TIME):仅存储小时、分钟和秒 时间戳类型(DATETIME或TIMESTAMP):存储日期和时…

    other 2023年6月25日
    00
  • js添加style

    JS 添加 Style 在 Web 开发中,我们经常需要使用 JavaScript 动态地添加样式。本文将介绍如何使用 JavaScript 添加 Style,包括基本概念、应用场景、实现方法和示例说明。 基本概念 在 Web 开发中,我们可以使用 JavaScript 动态地添加样式。通过添加样式,我们可以改变元素的外观、布局和行为。在 JavaScrip…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部