c# datagridview 行拖拽

### C# DataGridView 行拖拽实现详解 在C#中,`DataGridView` 是一个非常强大的控件,用于显示数据,并提供了丰富的功能来处理表格数据。本文将详细介绍如何实现在 `DataGridView` 控件中的行拖拽功能,即允许用户通过简单的鼠标操作对表格中的行进行上移或下移的操作。 #### 一、基础知识准备 在开始实现之前,我们先了解一些基本概念: - **DataGridView**: 它是 Windows Forms 应用程序中用于显示数据的一种控件。 - **Row Dragging**: 即行拖拽功能,它允许用户通过拖拽某一行到其他位置来重新排序这些行。 - **事件**: 在 C# 和 .NET Framework 中,事件是一种特殊的委托类型,用于封装应用程序中的某个动作的发生。在本例中,我们会使用 `MouseDown`, `DragDrop` 等事件。 #### 二、代码解析 下面我们将根据给定的部分内容逐步解析实现行拖拽的关键步骤: 1. **初始化 DataGridView** 我们需要初始化 `DataGridView` 控件,并设置其数据源。这部分代码如下所示: ```csharp public partial class Form1 : Form { List<str> strs = new List<str>(); // ... 其他代码 private void Form1_Load(object sender, EventArgs e) { // 初始化数据 str st = new str(); st.No = 100; st.Val = "aaa"; // ... // 添加数据到列表 strs.Add(st); // ... // 设置 DataGridView 的数据源 dgv.DataSource = strs; // 选中第一行 dgv.Rows[0].Selected = true; } } ``` 2. **实现行的上移和下移** 接下来,我们需要实现当用户点击按钮时,可以将当前选中的行向上或向下移动的功能。这可以通过交换数据列表中的元素顺序来实现。示例如下: ```csharp private void _Up_Click(object sender, EventArgs e) { int index = dgv.CurrentRow.Index; if (index == -1) return; if (index < 1) return; str selStr = strs[index]; str swapStr = strs[index - 1]; int tempSno = selStr.No; selStr.No = swapStr.No; swapStr.No = tempSno; strs.Remove(swapStr); strs.Insert(index, swapStr); dgv.DataSource = strs; } private void _Down_Click(object sender, EventArgs e) { int index = dgv.CurrentRow.Index; if (index == -1) return; if (dgv.SelectedRows.Count - 1 == index) return; str selStr = strs[index]; str swapStr = strs[index + 1]; int tempSno = selStr.No; selStr.No = swapStr.No; swapStr.No = tempSno; strs.Remove(swapStr); strs.Insert(index, swapStr); dgv.DataSource = strs; } ``` 3. **实现行拖拽功能** 要实现行的拖拽功能,我们可以监听 `DataGridView` 的 `MouseDown` 和 `DragDrop` 事件。在 `MouseDown` 事件中,设置一个标记来表示是否开始了拖拽操作;在 `DragDrop` 事件中,则根据鼠标的当前位置来判断应该将行放置到哪个位置。 ```csharp bool flag = false; private void dgv_MouseDown(object sender, MouseEventArgs e) { flag = true; } private void dgv_DragDrop(object sender, DragEventArgs e) { Point p = this.dgv.PointToClient(new Point(e.X, e.Y)); DataGridView.HitTestInfo hit = this.dgv.HitTest(p.X, p.Y); if (hit.Type == DataGridViewHitTestType.RowHeader) { // 实现拖拽逻辑 // ... } } ``` #### 三、总结 通过以上步骤,我们成功实现了 `DataGridView` 控件中的行拖拽功能。需要注意的是,这里只展示了部分核心代码,实际应用中可能还需要考虑更多的边界情况以及异常处理等细节问题。此外,为了提高用户体验,还可以添加动画效果来模拟真实的拖拽过程。希望本文能够帮助你理解和实现这一功能。















using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<str> strs = new List<str>();
string[] rowIndex = null; //???中的行号
private void Form1_Load(object sender, EventArgs e)
{
str st = new str();
st.No = 100;
st.Val = "aaa";
str st1 = new str();
st1.Val = "bbb";
str st2 = new str();
st2.No = 103;
st2.Val = "ccc";
str st3 = new str();
st3.No = 104;
st3.Val = "ddd";
str st4 = new str();
st4.No = 105;
st4.Val = "eee";
str st5 = new str();
st5.No = 106;
st5.Val = "fff";
str st6 = new str();
st6.No = 107;
st6.Val = "ggg";
str st7 = new str();
st7.No = 108;
st7.Val = "hhh";
str st8 = new str();
st8.No = 888;
剩余7页未读,继续阅读

- zhongwenbo5202012-09-05发现不是很行哦,可能是我自己技术问题吧
- WWJ22002292012-12-11不是很好用,不过还是谢谢了
- showwe2012-05-07是text保存的源码,还需要加工下,呵呵
- 不会走路2013-02-22哈哈 很好用 ,自己加工一下就可以变成自己想要的啦
- chenbihai2019-07-26可以,很不错

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 网络工程师2019年终工作总结.doc
- 聚美优品网络营销分析.ppt
- 学生缴费注册管理系统数据库设计.doc
- 内蒙古准格尔旗高中数学第一章算法初步1.2条件语句拓展课件新人教B版必修3.ppt
- 无线传感器网络中节点定位算法的研究.doc
- 2023年计算机应用基础形成性考核册答案.doc
- 学习]网络环境下的图书馆信息咨询服务.ppt
- 网络技术部季度工作总结.pptx
- 中国联通互联网-智慧园区解决方案PPT课件.ppt
- 模具CADCAM试题.doc
- 计算机操作系统试题库.doc
- 孕前优生健康检查项目乡镇软件资料.doc
- 计算机毕业设计仓库管理系统.doc
- 中学校园高清网络监控系统解决方案.docx
- 通信工程认知实习报告.docx
- 活动方案之网络技术培训方案.docx


