winform上控件的拖拽小结

这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考。

属性:

AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西。

事件:

ItemDrag: 源控件在拖动开始时发生。在这里需调用DoDragDrop方法开始拖拽行为。

DragEnter:目标控件接受到拖拽行为时发生。在这里可以通过e.Effect设定目标控件能接受的拖拽行为。

DragOver:目标控件接受到拖拽行为时不间断发生。在DragEnter后触发。这里不可做耗时操作。

DragLeave:拖拽离开目标控件后触发。

DragDrop:拖拽开始后,在目标控件上松开鼠标时触发。

比如把一个ListView(A)的ListViewItem拖拽到TreeView(B)上的需要完成的步骤如下。

1,设置B的AllowDrop=true;

2,需要添加的事件和事件执行顺序如下:

有“放”操作时:ItemDrag(A)→DragEnter(B)→DragOver(B)→DragDrop(B) 

没有“放”操作时:ItemDrag(A)→DragEnter(B)→DragOver(B)→DragLeave(B) 

下面给一个简单的实现,并实现高亮显示treeview节点:

        // listview
        private void fileView_ItemDrag(object sender, ItemDragEventArgs e)
        {
            var item = e.Item as ListViewItem;

            (sender as ListView).DoDragDrop(item.Tag as string, DragDropEffects.Copy);
        }

        // treeview
        private void folderView_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void folderView_DragOver(object sender, DragEventArgs e)
        {
            var location = this.folderView.PointToClient(new Point(e.X, e.Y));
            var node = this.folderView.GetNodeAt(location);
            if (node == null) return;
            if (node.PrevVisibleNode != null)
            {
                node.PrevVisibleNode.BackColor = node.TreeView.BackColor;
                node.PrevVisibleNode.ForeColor = node.TreeView.ForeColor;
            }
            if (node.NextVisibleNode != null)
            {
                node.NextVisibleNode.BackColor = node.TreeView.BackColor;
                node.NextVisibleNode.ForeColor = node.TreeView.ForeColor;
            }
            node.BackColor = SelectedBackColor; ;
            node.ForeColor = SelectedForeColor;
        }

        private void folderView_DragDrop(object sender, DragEventArgs e)
        {
            var abc = e.Data.GetData(DataFormats.Text);
            var location = this.folderView.PointToClient(new Point(e.X, e.Y));
            var node = this.folderView.GetNodeAt(location.X, location.Y);
            // do something...
            ClearTreeNodesDragColor(this.folderView.Nodes);
        }
        private void ClearTreeNodesDragColor(TreeNodeCollection treeNodes)
        {
            foreach (TreeNode node in treeNodes)
            {
                if (!node.IsVisible)
                    continue;
                node.BackColor = node.TreeView.BackColor;
                node.ForeColor = node.TreeView.ForeColor;
                ClearTreeNodesDragColor(node.Nodes);
            }
        }
        private void folderView_DragLeave(object sender, EventArgs e)
        {
            ClearTreeNodesDragColor(this.folderView.Nodes);
        }

上面的代码功能不完全,要实现如拖动时显示图标,以及桌面和应用程序之间的互相拖动可以参看下面的几篇文章,这要求有一定的WindowsAPI编程经验,供大家参考吧。

.NET中的Drag and Drop操作(一)

http://www.codeproject.com/Articles/15059/C-File-Browser

时间: 2024-08-01 06:01:08

winform上控件的拖拽小结的相关文章

ToolStrip控件左右拖拽移动效果实现

1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位.2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果.拖动到控件边缘距窗体边缘1/3宽度时(可设),自动回弹.拖动控件边缘在屏幕内时释放鼠标,控件自动回弹,边缘吸附窗体边缘.3.当ToolStrip控件中子控件数目较少可以在屏幕上完全显示时,拖动效果不可见.4.增加 添加.删除 按钮,点击时可增删一个ToolStripButton,方便拖动效果可见(ToolStrip控件中子控件

winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法。

protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } 接着找办法解决500多个控件PAINT缓慢的效能问题,心塞.分类都不想分了,就这样. winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法.,布布扣,bubuko.com

HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态

多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption></figcaption>: 多媒体标题 方法: load() 加载.play()播放.pause()暂停 属性: currentTime 视频播放的当前进度. duration:视频的总时间. paused:视频播放的状态 事件:   oncanplay:事件在用户可以开始播放视频/音频(aud

NGUI控件不能拖拽问题

NGUI3.6版本 第一种方案: 1.  NGUI Options  Handles -> turn off         拖动打开 第二种方案: 1.  勾选上Edit –> Project Setting –> Physics –>Layer Collision Matrix勾选上UI

在delphi中实现控件的拖拽

提示:可以添加一个布尔来控制可否拖动的状态,这里提供所有都能拖动的方法. 1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 2 Shift: TShiftState; X, Y: Integer); 3 begin 4 ReleaseCapture; 5 SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0); 6 end;

c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。

首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(ThreadFuntion); thread.IsBackground = true; thread.Start(); } private void Thread

在DevExpress程序中使用Winform分页控件直接录入数据并保存

一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数据,这种对于字段比较少,而且内容相对比较简单的情况下,效率是比较高的一种输入方式.本篇随笔主要介绍在DevExpress程序中使用GridView直接录入数据并保存的实现,以及使用Winform分页控件来进行数据直接录入的实现操作. 1.在GridView上展示数据 在GridView上展示数据,只

winform分页控件

五一过的一多半已经过去了,感觉过的真快. 言归正传说说最近一直在用的winform分页控件. 一. 添加新项-用户控件 二.拖控件,这个很简单 三.写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Win

类似web风格的 Winform 分页控件

背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下,发现路过秋天在多年前写了个分页控件,Winform 通用分页控件实战篇(提供源码下载).站在大神的肩膀上就是快,一会就改好了. 效果图 功能比较齐全,不过样式上,楼主十分喜欢easyUI或ext的列表分页风格.于是换了几个按钮,添加了图标,看看现在的效果. 控件源码在正文最下方. 使用简介 就那么一