当前位置:  编程技术>.net/c#/asp.net

WinForm拖拽控件生成副本的解决方法

    来源: 互联网  发布时间:2014-11-01

    本文导语:  本文讲述了WinForm中实现拖拽效果的功能,即在WinForm中有一个Button,可以实现拖拽这个Button到目标位置后生成一个该控件的副本的功能。具体操作步骤如下: 要实现该功能主要分成如下三步: 1)确定被拖拽的对象:这里是Butto...

本文讲述了WinForm中实现拖拽效果的功能,即在WinForm中有一个Button,可以实现拖拽这个Button到目标位置后生成一个该控件的副本的功能。具体操作步骤如下:

要实现该功能主要分成如下三步:

1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop——该函数接受两个参数:i)要拖动的数据。ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):

C#代码如下:

Button1.DoDragDrop(Button1, DragDropEffects.Copy || DragDropEffects.Move); //形成拖拽效果,移动+拷贝的组合效果

VB.NET页面代码如下:

Button1.DoDragDrop(Button1, DragDropEffects.Copy Or DragDropEffects.Move)  '形成拖拽效果,移动+拷贝的组合效果

2)目标位置:这里是Form窗体自身。为了使得和Windows资源管理器中实现的文件拖拽效果一样(即拖拽一个文件到目标位置的中途,鼠标出现“+”号的效果)。那么应当处理DragEnter事件——即拖拽控件途中进入Form体内把效果设置成Copy的效果。

C#代码如下:

private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e)
{
  //当Button被拖拽到WinForm上时候,鼠标效果出现
  if ((e.Data.GetDataPresent(typeof(Button)))) {
    e.Effect = DragDropEffects.Copy;
  }
}

VB.NET页面代码如下:

Private Sub Form1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
    If (e.Data.GetDataPresent(GetType(Button))) Then  '当Button被拖拽到WinForm上时候,鼠标效果出现
      e.Effect = DragDropEffects.Copy
    End If
  End Sub

同时,为了使得Form自身支持接受拖拽传来的控件,必须设置其AllowDrag=True:

另外,一旦松开鼠标,那么拖拽过程结束。此时应当处理DragDrop事件,复制一个按钮:

C#代码如下:

private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e)
{
  //拖放完毕之后,自动生成新控件
  Button btn = new Button();
  btn.Size = Button1.Size;
  btn.Location = this.PointToClient(new Point(e.X, e.Y));
  //用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
  this.Controls.Add(btn);
  btn.Text = "按钮" + count.ToString;
  count = count + 1;
}

VB.NET页面代码如下:

Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
    '拖放完毕之后,自动生成新控件
    Dim btn As New Button
    btn.Size = Button1.Size
    btn.Location = Me.PointToClient(New Point(e.X, e.Y))  '用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
    Me.Controls.Add(btn)
    btn.Text = "按钮" + count.ToString
    count = count + 1
  End Sub

这里需要注意点:Location属性(指定控件放置位置的起始点)不能直接用e.X或e.Y——因为这是屏幕坐标,要根据实际的控件界面坐标进行适度转换,最简单方法是——PointToClient方法。

下面给出完整代码:

【界面如下所示】

C#代码如下:

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class Form1
{

  //计数变量,说明输出了第N个Button

  private int count = 1;
  private void Form1_Load(System.Object sender, System.EventArgs e)
  {
    this.AllowDrop = true;
    //窗体自身支持接受拖拽来的控件
  }

  private void Button1_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
  {
    //左键的话,标志位为true(表示拖拽开始)
    if ((e.Button == System.Windows.Forms.MouseButtons.Left)) {
      Button1.DoDragDrop(Button1, DragDropEffects.Copy | DragDropEffects.Move);
      //形成拖拽效果,移动+拷贝的组合效果
    }
  }

  private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e)
  {
    //当Button被拖拽到WinForm上时候,鼠标效果出现
    if ((e.Data.GetDataPresent(typeof(Button)))) {
      e.Effect = DragDropEffects.Copy;
    }
  }

  private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e)
  {
    //拖放完毕之后,自动生成新控件
    Button btn = new Button();
    btn.Size = Button1.Size;
    btn.Location = this.PointToClient(new Point(e.X, e.Y));
    //用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
    this.Controls.Add(btn);
    btn.Text = "按钮" + count.ToString();
    count = count + 1;
  }
  public Form1()
  {
    DragDrop += Form1_DragDrop;
    DragEnter += Form1_DragEnter;
    Load += Form1_Load;
  }
}

 

VB.NET页面代码如下:

Public Class Form1

  '计数变量,说明输出了第N个Button
  Private count As Integer = 1

  Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Me.AllowDrop = True   '窗体自身支持接受拖拽来的控件
  End Sub
 
  Private Sub Button1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
    '左键的话,标志位为true(表示拖拽开始)
    If (e.Button = Windows.Forms.MouseButtons.Left) Then
      Button1.DoDragDrop(Button1, DragDropEffects.Copy Or DragDropEffects.Move)  '形成拖拽效果,移动+拷贝的组合效果
    End If
  End Sub

  Private Sub Form1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
    If (e.Data.GetDataPresent(GetType(Button))) Then  '当Button被拖拽到WinForm上时候,鼠标效果出现
      e.Effect = DragDropEffects.Copy
    End If
  End Sub

  Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
    '拖放完毕之后,自动生成新控件
    Dim btn As New Button
    btn.Size = Button1.Size
    btn.Location = Me.PointToClient(New Point(e.X, e.Y))  '用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
    Me.Controls.Add(btn)
    btn.Text = "按钮" + count.ToString
    count = count + 1
  End Sub
End Class

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Winform实现将网页生成图片的方法
  • c#多线程更新窗口(winform)GUI的数据
  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
  • C# WinForm中禁止改变窗口大小的方法
  • WinForm相对路径的陷阱
  • c# Winform 全窗口拖动的代码
  • C# Winform 整个窗口拖动的实现代码 iis7站长之家
  • WinForm实现关闭按钮不可用或隐藏的方法
  • 解读在C#中winform程序响应键盘事件的详解
  • c# winform 关闭窗体时同时结束线程实现思路
  • WinForm实现读取Resource中文件的方法
  • C# Winform 整个窗口拖动的实现代码
  • WinForm下 TextBox只允许输入数字的小例子
  • Winform跨线程操作的简单方法
  • C# WinForm程序完全退出的问题解决
  • C# WinForm窗体编程中处理数字的正确操作方法
  • C# Winform 让整个窗口都可以拖动
  • 使用C# Winform应用程序获取网页源文件的解决方法
  • c# 天气预报查询(winform方法)的实现代码(图文)
  • C# Winform 禁止用户调整ListView的列宽
  • C# winform编程中响应回车键的实现代码
  • C#中禁止Winform窗体关闭的实现方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3