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

如何在C#中按下N键时跳转到ObjectListView的下一个同名行?

实现ObjectListView按N键跳转到下一个同名行的解决方案

方案一:通过外部事件绑定实现(推荐,无需修改控件源码)

直接在窗体代码中绑定ObjectListView的KeyDown事件,在事件处理逻辑中完成查找与跳转:

  1. 绑定事件:在窗体初始化或构造函数中添加事件绑定
// 假设你的ObjectListView实例名为olvMain
olvMain.KeyDown += OlvMain_KeyDown;
  1. 编写事件处理逻辑
private void OlvMain_KeyDown(object sender, KeyEventArgs e)
{
    // 仅处理N键且存在选中行的情况
    if (e.KeyCode != Keys.N || olvMain.SelectedItems.Count == 0)
        return;

    e.Handled = true; // 阻止控件默认按键行为
    var currentSelectedItem = olvMain.SelectedItems[0];
    // 获取当前选中行的名称值(olvcName列对应的数据)
    var targetName = currentSelectedItem.GetValue(olvcName)?.ToString();

    if (string.IsNullOrEmpty(targetName))
        return;

    int currentIndex = olvMain.IndexOf(currentSelectedItem);
    // 从当前行的下一行开始遍历查找
    for (int i = currentIndex + 1; i < olvMain.Items.Count; i++)
    {
        var currentItem = olvMain.Items[i];
        var itemName = currentItem.GetValue(olvcName)?.ToString();
        // 匹配名称(可根据需求调整大小写敏感规则)
        if (targetName.Equals(itemName, StringComparison.OrdinalIgnoreCase))
        {
            // 选中目标行并滚动到视图内
            olvMain.SelectedItems.Clear();
            olvMain.SelectedItems.Add(currentItem);
            olvMain.EnsureVisible(i);
            break;
        }
    }
}

方案二:修改ObjectListView源码(不推荐,控件升级会丢失修改)

如果你坚持要在HandleKeyDown方法中添加逻辑,可按以下步骤修改:

  1. 打开ObjectListView.cs文件,找到HandleKeyDown方法
  2. 在方法内添加N键检测与处理逻辑:
// 插入到合适的位置,比如在Space键处理逻辑之后
if (e.KeyCode == Keys.N && this.SelectedItems.Count > 0)
{
    e.Handled = true;
    var currentItem = this.SelectedItems[0];
    // 找到olvcName列(可通过Name属性或直接引用)
    var targetColumn = this.Columns.Cast<OLVColumn>().First(c => c.Name == "olvcName");
    var targetName = currentItem.GetValue(targetColumn)?.ToString();

    if (string.IsNullOrEmpty(targetName))
        return;

    int currentIndex = this.IndexOf(currentItem);
    for (int i = currentIndex + 1; i < this.Items.Count; i++)
    {
        var item = this.Items[i];
        var itemName = item.GetValue(targetColumn)?.ToString();
        if (targetName.Equals(itemName, StringComparison.OrdinalIgnoreCase))
        {
            this.SelectedItems.Clear();
            this.SelectedItems.Add(item);
            this.EnsureVisible(i);
            break;
        }
    }
}

额外优化建议

  • 如果需要循环查找(遍历到列表末尾后从头开始查找),可在遍历完末尾后添加从0到currentIndex的循环逻辑
  • 根据业务需求调整字符串比较规则,比如改为StringComparison.Ordinal启用大小写敏感匹配

内容的提问来源于stack exchange,提问作者Andrew Cottrell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:37:05