如何在C#中按下N键时跳转到ObjectListView的下一个同名行?
实现ObjectListView按N键跳转到下一个同名行的解决方案
方案一:通过外部事件绑定实现(推荐,无需修改控件源码)
直接在窗体代码中绑定ObjectListView的KeyDown事件,在事件处理逻辑中完成查找与跳转:
- 绑定事件:在窗体初始化或构造函数中添加事件绑定
// 假设你的ObjectListView实例名为olvMain olvMain.KeyDown += OlvMain_KeyDown;
- 编写事件处理逻辑
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方法中添加逻辑,可按以下步骤修改:
- 打开
ObjectListView.cs文件,找到HandleKeyDown方法 - 在方法内添加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
相关产品推荐
相关产品推荐

