winform中拖动功能实现技巧

实现的需求,我通过拖动选中的用户行放到左边的机构节点上,从而实现用户改变组织机构的关系

如下图

贴代码

 private DataGridViewSelectedRowCollection sourceRowCollection = null;
        private int rowIndexFromMouseDown;

        /// <summary>
        /// 用户拖动到机构里改变所属机构关系
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvUser_MouseDown(object sender, MouseEventArgs e)
        {
            rowIndexFromMouseDown = dgvUser.HitTest(e.X, e.Y).RowIndex;
            if (rowIndexFromMouseDown != -1)
            {
                if (this.dgvUser.SelectedRows.Count > 0)
                {
                    sourceRowCollection = this.dgvUser.SelectedRows;
                }
            }
            else
            {
                sourceRowCollection = null;
            }
        }

        private void dgvUser_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (sourceRowCollection != null)
                {
                    DragDropEffects effect = this.dgvUser.DoDragDrop(sourceRowCollection, DragDropEffects.Move);
                    if (effect == DragDropEffects.Move)
                    {
                        //在sourceGrid中移除选中行
                        foreach (DataGridViewRow row in sourceRowCollection)
                        {
                            this.dgvUser.Rows.Remove(row);
                        }
                        sourceRowCollection = null;
                    }
                }
            }
        }

        private void tvwOrganize_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                if (e.Data.GetDataPresent(typeof(DataGridViewSelectedRowCollection)))
                {
                    DataGridViewSelectedRowCollection rowCollection = e.Data.GetData(typeof(DataGridViewSelectedRowCollection)) as DataGridViewSelectedRowCollection;
                    if (rowCollection == null)
                    {
                        return;
                    }
                    string userid = (rowCollection[0].DataBoundItem as DataRowView).Row["UserID"].ToString();
                    string organizeid = (rowCollection[0].DataBoundItem as DataRowView).Row["OrganizeID"].ToString();
                    Point p = this.tvwOrganize.PointToClient(new Point(e.X, e.Y));
                    TreeViewHitTestInfo hitTest = tvwOrganize.HitTest(p.X, p.Y);
                    Organize organize = hitTest.Node.Tag as Organize;
                    if (organizeid != organize.OrganizeID && userBiz.UpdateUserOrganize(userid, organize.OrganizeID))
                    {
                        e.Effect = DragDropEffects.Move;
                    }
                    else
                    { e.Effect = DragDropEffects.None; }
                }
            }
            catch (Exception ex)
            {
                e.Effect = DragDropEffects.None;
            }
        }

        private void tvwOrganize_DragOver(object sender, DragEventArgs e)
        {
            if (!e.Data.GetDataPresent(typeof(DataGridViewSelectedRowCollection)))
            {
                e.Effect = DragDropEffects.None;
                return;
            }
            else
            {
                e.Effect = DragDropEffects.Move;  //这个值会返回给DoDragDrop方法
            }
        }
时间: 2024-10-09 11:07:11

winform中拖动功能实现技巧的相关文章

C#中winform去掉边框后实现拖动功能

在winform中,当我们把窗体的属性中 FormBorderStyle 指示窗体的边框和标题栏的外观和行为的属性设置为None时,我们会发现拖动窗体的功能也随之消失,这时候我们可以使用MouseDown事件来注册拖动移动窗体的功能,利用Windows的API,实现代码如下 [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] p

winform中DataGridView实现分页功能

http://liyaguang20111105.blog.163.com/blog/static/19929420220146283255809/ 在winform的设计中,要实现对DataGridView控件的分页功能,需要两个控件:BindingSource.BindingNavigator,根据需求可对BindingNavigator进行自由的扩展,下图的示例则是根据一般需求对分页功能的实现.红色区域是对BindingNavigator控件扩展后的效果. 具体实现过程 : //窗体构造方

winform中的小技巧【自用】

一.C#在WinForm中怎样让多行TEXTBOX的换行 今天做项目,有一段提示文字需要弹出来,由于太长,我就想能不能让它换行.然后就百度了一下,嘿嘿,方法很好用哦. 原文链接:https://blog.csdn.net/vince6799/article/details/7356043 原文地址:https://www.cnblogs.com/wsn1203/p/11557767.html

Visual Studio 2015中的常用调试技巧分享

.NET 技术交流群:337901356 欢迎您的加入! 为什么要学习调试? 调试(Debug)是作为一个程序员必须要学会的东西,学会调试可以极大的提高开发效率,排错时间,很多人不喜欢调试,但我认为这是一个很不可取的选择,调试的时候能让我们看到程序的执行顺序.步骤以及过程等,调试的时候可以让我们监视代码中各个变量的情况,调试让我们可以让我们快速的找出错误的根源.可见调试是至关重要的. 要学习好怎么调试,那么必须去了解VS 这个IDE中的各种调试技巧,下面我就讲讲我所经常在调试程序中所用到的技巧.

Eclipse+python的安装与使用(详细阐述了eclipse编写Python程序的基本功能及技巧)

安装环境说明: 操作系统:win7 JDK:jdk1.7.0_11 下载网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse:eclipse-jee-kepler-SR2-win32-x86_64 下载网址: http://www.eclipse.org/downloads/ http://www.eclipse.org/downloads/download.php?file=/technolo

Mac预览怎么用 Mac预览功能实用技巧大全

Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具,接下来Pc6苹果小编给大家详细介绍一下Mac预览功能实用技巧. 目前的 Mac 预览程式可以支持 TIFF. PNG. JPEG. GIF. BMP. PDF 等主要文件格式的浏览与编辑,而单纯预览上也可以支持像是 Photoshop 等专业图像处理软件. Office 等专业文书处理软件所产生的特殊文件格

OAF开发中一些LOV相关技巧 (转)

原文地址:OAF开发中一些LOV相关技巧 在OAF开发中,LOV的使用频率是很高的,它由两部分构成一是页面上的LOV输入框(如OAMESSageLovInputBean),二是弹出的LOV模式窗口(OAListOfValueBean).用户选择LOV的按钮就会弹出LOV窗口,用户在LOV窗口查询并选择了值,可以返回到页面上的LOV输入框.在这里就不赘述如何创建LOV,只说一些平时会碰到的应用: 1.控制LOV的查询结果 2.LOV相关事件 3.动态LOV 4.LOV Choice一,控制LOV的

在 WinForm 中使用 Direct2D

在 C# 的 WinForm 应用中,界面的绘制使用的是 GDI+.不过在一些特别的应用中,可能需要用硬件加速来提高绘制的效率.下面就来介绍两种在 WinForm 应用中嵌入 Direct2D 的方法. 这里所谓的“嵌入”,指的是只有窗口的某一部分应用 Direct2D 绘制(用一些控件承载),而不是整个窗口都使用 Direct2D 绘制.这是一种混合方案,需要用硬件加速的部分由自己来绘制,其它部分仍然可以使用现有的 WinForm 技术. 至于 Direct2D 的类库,我仍然使用 Sharp

在Winform中播放视频等【DotNet,C#】

在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件上绘图,这种比较复杂.于是采用的是第一种方法. 先从VS的工具箱里添加Windows Media Player组件,方式是打开工具箱,在最下面的空白处点击右键,选择项,然后在弹出的对话框里切换到Com组件标签项,找到“Windows Media Player”项并选中,确定后将在工具箱中看到多出一个