请问DataView过滤后用dataGridView显示,在不同列排序的情况下如何获得当前行的下一行?

erif1001 2010-09-07 10:10:48
DataView过滤后用dataGridView显示,在不同列排序的情况下如何获得当前dataGridView显示下选中行的下一行内容?


DataView dv1= new DataView(dt1);//dt1为DataTable
dv1.RowFilter = "Name = 0";
dataGridView1.DataSource = dv1;

我的操作:在dataGridView1当前行按下空格键,更改当前行某一列的值,如:“状态”列的值(dataGridView1.CurrentRow["状态"]),当keyup后选中的行跳到下一行。
问题来了:
情况一:如果当前的排序列不是“状态”列,那好办,KeyUp后当前dataGridView1中的顺序不会改变,主要Send(Enter或Down)就会跳到下一行;
情况二:排序的就是“状态”列,当KeyUp后dataGridView1的顺序可能被打乱,会自动重新排序,在KeyDown的时候如何取得KeyUp前当前行的下一行的内容,用来Up后定位??????

过滤后的dv1有没有一个行的编号?让我通过这个编号来得到下一行的内容
...全文
580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
erif1001 2010-09-12
  • 打赏
  • 举报
回复
谢谢大家,颜色通过排序中刷新行颜色处理的,效果还可以
Nick黄 2010-09-09
  • 打赏
  • 举报
回复
Up、没遇到过这类问题
glest 2010-09-09
  • 打赏
  • 举报
回复
//保存nextCell
nextCell=dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells["FILE_NAME"];

//keyup时
this.dataGridView1.CurrentCell=nextCell;

erif1001 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 glest 的回复:]
由于修改后会自动排序,所以不要保存Index,而应该保存DataGridViewRow对象:

DataGridViewRow nextRow=dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1]
[/Quote]
要设置下一行为选中行,我还是要用nextRow的关键字来找刷新排序后的行号
erif1001 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yanimaziba 的回复:]
我看了也有点晕,你就是把你控件上显示的数据进行排序是么 ?
那你得首先要找到你操作的当前行的ID.排序你可以交换2笔数据的顺序就是了。给表中加个字段为序号。根据当前行的ID 就可以知道它的序号。那么将它排序的话 交换序号的顺序就OK了.
[/Quote]
呵呵,
排序可能很多,我现在是在找到下一行的那个唯一值,在刷新后重新排序了再遍历找到行号,设置为当前行,现在的问题是颜色会乱
erif1001 2010-09-08
  • 打赏
  • 举报
回复
1:this.dataGridView1.CurrentRow.Cells["状态"].Value = "OK";
2:this.dataGridView1.CurrentRow.DefaultCellStyle.ForeColor = Color.Red;

3:NextRowFileName = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells["FILE_NAME"].Value.ToString();
4:this.dataGridView1.CurrentCell = dataGridView1[0, FindRow("FILE_NAME", NextRowFileName )];(FindRow是在dataGridView1中遍历寻找NextRowFileName 所在的行号)

3、4这两句就可以使dataGridView1的选中行往下一行跳,我在改值的同时在改变行的颜色,1、2句,若["状态"]这列被排序了,那么在dataGridView1自动刷新后顺序改变,但是行的颜色依旧,原来1-3行为红色,刷新后还是1-3行红色,要遍历一次dataGridView1重新设置颜色貌似反应比较慢,因为行数据量大,不知道如何让颜色随行变动?????
glest 2010-09-08
  • 打赏
  • 举报
回复
由于修改后会自动排序,所以不要保存Index,而应该保存DataGridViewRow对象:

DataGridViewRow nextRow=dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1]
jeven_xiao 2010-09-08
  • 打赏
  • 举报
回复
我看了也有点晕,你就是把你控件上显示的数据进行排序是么 ?
那你得首先要找到你操作的当前行的ID.排序你可以交换2笔数据的顺序就是了。给表中加个字段为序号。根据当前行的ID 就可以知道它的序号。那么将它排序的话 交换序号的顺序就OK了.
erif1001 2010-09-07
  • 打赏
  • 举报
回复
晕的很
这个定位可以通过dataGridView1.CurrentRow.Index + 1直接找到索引来找到下一行的值

我找到了这个Cell的值,Up之后如何是这个单元格的行成为选中行,也设置为CurrentCell??
因为KeyUP后顺序会乱,不能通过Index+1来设定, 在新顺序下只能通过遍历寻找这个Cell值来获得Index么?
this.dataGridView1.Rows[index].Selected = true;
this.dataGridView1.CurrentCell = dataGridView1[index,0];

能不能通过这个Cell的值(唯一的)来设定dataGridView1的选中行和CurrentCell ?????

110,559

社区成员

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

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

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