C# WinForm中KeyDown事件按Enter时如何维持DataGridView滚动位置?
解决DataGridView按Enter后滚动位置重置的问题
看起来你遇到了一个很典型的WinForms DataGridView行为差异问题——同样调用addToSell(),双击单元格能保留滚动位置,但按Enter就会滚回顶部,我来帮你分析下原因和解决办法:
问题根源
按下Enter键时,DataGridView会执行它的默认键盘行为:比如自动将焦点切换到下一行、结束当前单元格的编辑状态,这些内置操作会在你调用after()设置滚动位置之后,偷偷修改滚动状态,导致最终滚回顶部。而双击单元格的事件不会触发这些默认键盘逻辑,所以滚动位置能正常保留。
快速解决办法
你只需要在KeyDown事件里,告诉系统不要执行Enter键的默认行为就好了,修改后的完整代码如下:
private void dataGridSrch_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // 阻止Enter键的默认系统行为,避免干扰滚动位置设置 e.SuppressKeyPress = true; e.Handled = true; addToSell(); } }
额外的稳定性优化
另外,在你的after()方法里,重新绑定数据源后设置选中行和滚动位置时,最好加个索引有效性判断,防止因为数据更新后行数变化导致索引越界异常:
// 在after()方法中,设置选中行和滚动位置的代码前添加判断 if (index >= 0 && index < dataGridSrch.Rows.Count) { dataGridSrch.Rows[index].Selected = true; dataGridSrch.FirstDisplayedScrollingRowIndex = scrollPos; }
这样修改后,按Enter触发操作时,滚动位置就会和双击单元格一样正常维持了。
内容的提问来源于stack exchange,提问作者Jepher
相关产品推荐
相关产品推荐

