gpt4 book ai didi

c# - 使用键盘选择列表框项目

转载 作者:行者123 更新时间:2023-11-30 14:14:04 26 4
gpt4 key购买 nike

谁能告诉我当有多个项目以相同字符开头时,我应该如何以编程方式使用键盘选择列表框中的项目。例如,

  • 一个
  • 两个
  • 三个
  • 一次
  • 橙色

如果我想通过输入 o,n,c 来关注“Once”,我应该怎么做?与默认行为相反,不是从一个项目跳到另一个项目。

最佳答案

将 KeyPress 事件处理程序添加到 ListBox 并跟踪按下的键。然后将已键入的完整值与 ListBox 中项目的值进行比较。如果有匹配项,请选择该项目。

编辑:

这是我创建的有效解决方案。我还测量按键之间的时间。这样,如果按键之间的时间超过 1.5 秒,搜索字符串将被清空并重新填充上一个搜索字符。之后就像我说的那样:找到一个匹配项,如果有匹配项,则选择该项目。这两个私有(private)字段是类级字段,用于跟踪最后一次按键的时间,字符串用于存储搜索字符串。

private DateTime _lastKeyPress;
private string _searchString;

private void ListBox1KeyPress(object sender, KeyPressEventArgs e)
{
var newDate = DateTime.Now;
var diff = newDate - _lastKeyPress;

if (diff.TotalSeconds >= 1.5)
_searchString = string.Empty;
_searchString += e.KeyChar;

for (var i = 0; i < listBox1.Items.Count; i++)
{
var item = listBox1.Items[i].ToString();
if (item.ToLower().StartsWith(_searchString))
{
listBox1.SelectedItem = item;
break;
}
}
_lastKeyPress = newDate;
e.Handled = true; //REALLY IMPORTANT TO HAVE THIS
}

下面是一个使用 LinQ 获取搜索项匹配项的示例:

private void ListBox1KeyPress(object sender, KeyPressEventArgs e)
{
var newDate = DateTime.Now;
var diff = newDate - _lastKeyPress;
if (diff.TotalSeconds >= 1.5)
_searchString = string.Empty;
_searchString += e.KeyChar;

var found = listBox1.Items.Cast<object>().Select(t => t.ToString()).Where(item => item.ToLower().StartsWith(_searchString)).FirstOrDefault();
if(!String.IsNullOrEmpty(found))
listBox1.SelectedItem = found;

_lastKeyPress = newDate;
e.Handled = true;
}

希望对您有所帮助! ;)

编辑2:

不知道你有没有注意到关于e.Handled重要性的注释。默认情况下,如果您按下 ListBox 中的某个键,该控件将选择第一个找到的具有该键字符的项目。但它没有我的代码所具有的功能。因此,如果您远程控制 e.Handled 行,代码将起作用,但控件也会处理按键,而您不希望这样:项目将不会被正确选择!

关于c# - 使用键盘选择列表框项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12929984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com