实现DataGridView行的拖动,即实现行的顺序交换

参考:http://blog.csdn.net/soarheaven/article/details/3267379

1.界面准备

(1)首先在form中添加一个DataGridView控件,将默认AllowDrop=false 的属性设置为True,否侧不能拖动!

(2)对DataGridView的对象实现非数据源的绑定,因为设置DataSource属性即当控件被数据绑定时,无法以编程方式向
DataGridView 的行集合中添加行。

2.代码准备

(1)控制移动时鼠标的图形,否则是一个禁止移动的标识

private void dataGridView1_DragEnter(object
sender, DragEventArgs e)

{

e.Effect =
DragDropEffects.Move;

}

(2)控制拖动的条件,也可以自行放宽条件

private
void  dataGridView1 _CellMouseMove(object sender,
DataGridViewCellMouseEventArgs e)

{

if ((e.Clicks < 2) &&
(e.Button == MouseButtons.Left))

{

if ((e.ColumnIndex
== -1) && (e.RowIndex > -1))

dataGridView1.DoDragDrop(dataGridView1.Rows[e.RowIndex],
DragDropEffects.Move);

}

}

(3)拖动后实现行的删除和添加,实现行交换位置的错觉

int selectionIdx = 0;

private
void  dataGridView1_DragDrop(object sender, DragEventArgs e)

{

int idx = GetRowFromPoint(e.X,
e.Y);

if (idx < 0) return;

if
(e.Data.GetDataPresent(typeof(DataGridViewRow)))

{

DataGridViewRow row
= (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));

dataGridView1.Rows.Remove(row);

selectionIdx =
idx;

dataGridView1.Rows.Insert(idx, row);

}

}

private int GetRowFromPoint(int x, int y)

{

for (int i = 0; i <
dataGridView1.RowCount; i++)

{

Rectangle rec =
dataGridView1.GetRowDisplayRectangle(i, false);

if
(dataGridView1.RectangleToScreen(rec).Contains(x, y))

return i;

}

return -1;

}

(4)控制被移动的行始终是选中行

private void
kryptonDataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs
e)

{

if (selectionIdx > -1)

{

dataGridView1.Rows[selectionIdx].Selected = true;

dataGridView1.CurrentCell = dataGridView1.Rows[selectionIdx].Cells[0];

}

}

实现DataGridView行的拖动,即实现行的顺序交换

时间: 2024-10-22 15:38:34

实现DataGridView行的拖动,即实现行的顺序交换的相关文章

C# DataGridView控件动态添加新行

C# DataGridView控件动态添加新行 DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控件动态添加新行的两种方法: 方法一: int index=this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[

C# DataGridView控件 动态添加新行

DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控件动态添加新行的两种方法: 方法一: int index=this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[0].Value = "1"; thi

C++统计代码注释行数 &amp; 有效代码行数 &amp; 代码注释公共行 &amp; 函数个数

问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代码和注释的公共行(如:3,4,15,22...) 2)有效代码行:指有代码的行,包括有代码和注释的公共行(如:1,4,11,15,25....) 3)代码注释公共行:指又有代码又有注释的行(如:4,15...) 4)函数个数:这个不用说明了吧. 以下为注释情况展示代码: 1 #include <st

system调用命令行命令而不显示命令行窗口

system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 1 #pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置入口地址 2 #include <windows.h> 3 #include <stdio.h>

jquery easyui datagrid设置行样式 不可删除某行

rowStyler: function (index,row) { if (parseInt(row.ksrs) > 0) { return 'color:red'; } }, onLoadSuccess:function(data){ var rows = data.rows; for (var j = 0; j < rows.length; j++) { if (parseInt(rows[j]["ksrs"]) > 0) { $(".datagrid-

从把3000行代码重构成15行代码谈起

如果你认为这是一个标题党,那么我真诚的恳请你耐心的把文章的第一部分读完,然后再下结论.如果你认为能够戳中您的G点,那么请随手点个赞. 把三千行代码重构为15行 那年我刚毕业,进了现在这个公司.公司是搞数据中心环境监控的,里面充斥着嵌入式.精密空调.总线.RFID的概念,我一个都不懂.还好,公司之前用Delphi写的老客户端因为太慢,然后就搞了个Webform的替代,恰好我对Asp.Net还算了解,我对业务的不了解并不妨碍我称成为这个公司的一个程序员.小公司也有小公司的好,人少,进去很快负责代码开

程序题目:输出图形 输入:n为打出图形的行数, m为每行的个数,t为图形符号

package com.day; import java.util.Scanner; public class M { public static void main(String[] args) { Scanner sc=new Scanner(System.in); /* System.out.println("用户请输入图形的行数="+"每行的个数="+"图形符号="); int n=sc.nextInt(); int m=sc.nextI

ORACLE行转列(行转1列,行转多列)

在oracle 11g release 2 版本中新增的listagg函数,listagg是一个实现字符串聚合的oracle内建函数;listagg(column,'分隔符') within group (order by column) over(partition by column)分隔符可以为空,order by必选项,可以order by null (1)select status,  listagg(risk_id, ',') within group (order by risk_

Oracle 行链接(Row chaining) 与行迁移(Row Migration)

场景:如果VarChar和VarChar2更经常修改,且修改的数据长度每次都不一样,这会引起“行迁移”现象 概念: 行链接(Row chaining) 与行迁移(Row Migration)当一行的数据过长而不能插入一个单个数据块中时,可能发生两种事情:行链接(row chaining)或行迁移(row migration). 行链接当第一次插入行时,由于行太长而不能容纳在一个数据块中时,就会发生行链接.在这种情况下,oracle会使用与该块链接的一块或多块数据块来容纳该行的数据.行连接经常在插