You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:27:24