关于C#的DataGridView刷新光标会跳的解决~

本文介绍了一种在 DataGridView 刷新时保持当前行选中状态的方法,通过记录鼠标点击位置并在数据更新后重新设置当前单元格,避免了刷新时光标跳转的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做了一个程序要用到DataGridView,然后再刷新的时候由于光标会自动跳到序号为0的行,导致有的时候看数据十分不爽。。。

因为用的DataGridView是绑在一个DataTable上的,所以没法往刷新函数里面写。。。

一开始是想找找有没有一个刷新事件,然后在刷新事件里面写,但是因为没找到那个事件,所以宣告放弃。

但是后来一想,因为DataTable的改变导致了DataGridView的刷新,所以可以在改变DataTable的方中控制DataGridView-_-||(因为都是界面,所以DataTable,DataGridView都在一个Form类里面,所以可以互相调,别吐槽结构粗糙哈~)

因为要看某一行,所以鼠标肯定要点那一行,所以用一个字段记录鼠标点在哪一行,用DataGridView中的CellClick这个事件就行。

protected virtual void DGV_Click(object sender, DataGridViewCellEventArgs e)
{
       if (e.RowIndex >= 0) DGVRowIndex = e.RowIndex;
}
如果点的是列头(就是会排序的那个地方)那么e.RowIndex的值是-1,所以要加一下判断~ e.RowIndex就是鼠标单击的那一行的序号,用DGVRowIndex记录。

然后在改变DataTable的方法中添加就行了

if (dgv.Rows.Count >= DGVRowIndex)
                dgv.CurrentCell = dgv.Rows[DGVRowIndex].Cells[0];
dgv是一个DataGridView的对象,CurrentCell能用来设置处于活动的单元格,把它变成刚才点的那行第一个单元格就行。

至于那个if是为了防止由于数据源删除了一些行,导致现在的总行数比之前鼠标点的行的序号要小而产生的异常。。。


如果想更精确一些,就用e.ColumnIndex来获取刚才点的是第几列,然后把上面Cells[0]中的0替换成刚才的列的序号就行了~


这样刷新之后就不会跳了~


C#的WinForms应用程序中,DataGridView控件是一个非常常用的数据展示和操作控件。每次光标选中一行时,你可以使用DataGridView的SelectionChanged事件来捕获这个动作并执行相应的操作。 以下是一个简单的示例代码,演示了如何在每次光标选中一行时获取选中行的索引和数据: ```csharp using System; using System.Windows.Forms; namespace DataGridViewExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitializeDataGridView(); } private void InitializeDataGridView() { // 初始化DataGridView控件 dataGridView1.ColumnCount = 3; dataGridView1.Columns[0].Name = "ID"; dataGridView1.Columns[1].Name = "Name"; dataGridView1.Columns[2].Name = "Age"; // 添加一些示例数据 dataGridView1.Rows.Add("1", "Alice", "25"); dataGridView1.Rows.Add("2", "Bob", "30"); dataGridView1.Rows.Add("3", "Charlie", "35"); } private void dataGridView1_SelectionChanged(object sender, EventArgs e) { // 获取当前选中的行 DataGridViewRow selectedRow = dataGridView1.CurrentCell.Row; if (selectedRow != null) { // 获取选中行的索引 int rowIndex = selectedRow.Index; // 获取选中行的数据 string id = selectedRow.Cells[0].Value?.ToString(); string name = selectedRow.Cells[1].Value?.ToString(); string age = selectedRow.Cells[2].Value?.ToString(); // 显示选中行的信息 MessageBox.Show($"Selected Row Index: {rowIndex} ID: {id}, Name: {name}, Age: {age}"); } } } } ``` 在这个示例中,我们首先初始化了一个DataGridView控件,并添加了一些示例数据。然后,我们订阅了DataGridView的SelectionChanged事件,每当用户选择不同的行时,该事件就会被触发。在事件处理程序中,我们获取当前选中的行,并读取该行的数据,最后通过一个消息框显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值