关于dataGridView数据重新加载后选中行问题。

ad9329 2009-06-23 11:42:39
我想在dataGridView数据重新加载后 选中行在当前界面的位置不动。
代码是这样的。
private DataTable m_dtAmbulance= new DataTable();


dataGridView_Ambulance.SuspendLayout();
//记录选择行
string tempStr = "";
if (dataGridView_Ambulance.SelectedRows.Count > 0)
{
tempStr = dataGridView_Ambulance.SelectedRows[0].Cells["车辆编码"].Value.ToString();
}
//重新加载数据集
m_dtAmbulance = AmbulanceDataCommBLL.Instance.GetValidAmbulance();
dataGridView_Ambulance.DataSource = m_dtAmbulance;
foreach (DataGridViewRow aRow in dataGridView_Ambulance.Rows)
{
if (aRow.Cells["车辆编码"].Value.ToString() == tempStr)
{
dataGridView_Ambulance.CurrentCell = aRow.Cells["实际标识"];
break;
}
}
dataGridView_Ambulance.ResumeLayout();

这段代码是在收到通信后会自动运行的;不是手动自己点击或操作运行的。
但是重新加载数据后 选择行 总是跳到当前界面下面的第二行去。
如何能让选中行在当前界面位置一点都不动???(其实就是竖向拉动条位置不动)
...全文
482 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
han_leng 2011-08-29
  • 打赏
  • 举报
回复
dataGridView1不知到在哪里???
ad9329 2009-06-24
  • 打赏
  • 举报
回复
问题解决了。
int temp = dataGridView_Ambulance.FirstDisplayedScrollingRowIndex
先保存这个当前界面第一行的索引。
再dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count-1].Cells["实际标识"];

if(temp >0)
dataGridView_Ambulance.FirstDisplayedScrollingRowIndex =temp
就可以使界面完全不动。
当然数据集的排序方式和过滤方式 都要和过去完全一样
itrefer 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 anheiguoke 的回复:]
把 e传给一个public变量 在bind后调用select事件时候穿变量的值 给e就搞定。
[/Quote]
不是“时间” 是“事件”
itrefer 2009-06-23
  • 打赏
  • 举报
回复
把 e传给一个public变量 在bind后调用select时间时候穿变量的值 给e就搞定。
xqyunyun 2009-06-23
  • 打赏
  • 举报
回复
tempStr = dataGridView_Ambulance.SelectedRows[0].Cells["车辆编码"].Value.ToString();
SelectedRows[0].没有写是选中哪一行吧.猜的,试试吧
itrefer 2009-06-23
  • 打赏
  • 举报
回复
仔细看看e selecting事件的参数是选中行的索引,保存。
ad9329 2009-06-23
  • 打赏
  • 举报
回复
dataGridView_Ambulance.CurrentCell = dataGridView_Ambulance.Rows[selectedIndex].Cells["车辆编码"];
方法我试了。一样选中是选中了。。没问题的。
但滚动条还是要向下划一下的。
数据很多的时候。行很多的时候。。一般选中行都会滚动到倒数第二行。

我想要的效果是 完全不动。。
wuyq11 2009-06-23
  • 打赏
  • 举报
回复
int selectedIndex = dataGridView_Ambulance.SelectedRows[0].RowIndex;
if (selectedIndex >= 0)
{

dataGridView_Ambulance.Rows[selectedIndex].Selected = true;
}
xxyping 2009-06-23
  • 打赏
  • 举报
回复
重新绑定数据无外乎就是数据被修改,添加,或者删除了
修改:
记录被选中行的索引,然后重绑定后再指向该行:
int indexRow = dataGridView1.CurrentRow.Index;
//赋值当前行
dataGridView1.CurrentCell = dataGridView1.Rows[indexRow].Cells["实际标识"];
添加:
直接锁定到最后一行
dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count-1].Cells["实际标识"];
删除也是一样,看你自己怎么定位

说实话 你的这个标识string tempStr = ""; 我不知道什么意思

zming 2009-06-23
  • 打赏
  • 举报
回复

private DataTable m_dtAmbulance= new DataTable();

int selectedIndex = -1; // <-- 保存当前选中行的索引

dataGridView_Ambulance.SuspendLayout();
//记录选择行
string tempStr = "";
if (dataGridView_Ambulance.SelectedRows.Count > 0)
{
selectedIndex = dataGridView_Ambulance.SelectedRows[0].Index; // <-- 保存当前第一个选中行的索引
tempStr = dataGridView_Ambulance.SelectedRows[0].Cells["车辆编码"].Value.ToString();
}

//重新加载数据集
m_dtAmbulance = AmbulanceDataCommBLL.Instance.GetValidAmbulance();
dataGridView_Ambulance.DataSource = m_dtAmbulance;
foreach (DataGridViewRow aRow in dataGridView_Ambulance.Rows)
{
if (aRow.Cells["车辆编码"].Value.ToString() == tempStr)
{
dataGridView_Ambulance.CurrentCell = aRow.Cells["实际标识"];
break;
}
}

// 防止索引越界
if (selectedIndex > dataGridView_Ambulance.Rows.Count - 1)
{
selectedIndex = dataGridView_Ambulance.Rows.Count - 1;
}

// 设定选中行
if (selectedIndex >= 0)
{
dataGridView_Ambulance.Rows[selectedIndex].Selected = true;

// 滚动到选中行,并且当前行也设置为选中行
// 注意,这里单元格必须可视, 即 visible = true;
dataGridView_Ambulance.CurrentCell = dataGridView_Ambulance.Rows[selectedIndex].Cells["车辆编码"];
}

dataGridView_Ambulance.ResumeLayout();
ad9329 2009-06-23
  • 打赏
  • 举报
回复
没有听懂。。有点想不清楚。e???select事件???怎么传变量

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧