首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按下“1”时,列表框循环显示项目

按下“1”时,列表框循环显示项目
EN

Stack Overflow用户
提问于 2019-01-04 00:47:51
回答 2查看 0关注 0票数 0

我正在使用ListBox创建一个应用程序。我希望用户能够点击它,开始输入,并看到他们的文字出现在该项目中。下面是一个几乎可以工作的简化版本:

代码语言:javascript
复制
using System.Windows.Forms;

namespace ListboxTest
{
    public partial class ListboxTest : Form
    {
        InitializeComponent();
        listBox1.Items.Add("");
        listBox1.Items.Add("");
        listBox1.KeyPress += new KeyPressEventHandler(ListBoxKeyPress);
    }

    private void ListBoxKeyPress(object sender, KeyPressEventArgs e)
    {
        ListBox lbx = (ListBox)sender;
        if (lbx.SelectedIndices.Count != 1)
            return;

        int temp = lbx.SelectedIndex;
        string value = lbx.Items[temp].ToString();
        value += e.KeyChar;

        lbx.Items[temp] = value;
    }
}

选择ListBox后,用户可以开始输入并查看显示的文本。一切都按预期工作,直到发生两件事:

  1. 用户从一个项目切换到另一个项目(单击进入不同的输入或使用向上/向下箭头),然后是
  2. 用户按下与未选择项目名称中的第一个字符对应的键。

从那时起,每当用户按下该键(在我的情况下,为'1')时,ListBox的所选项目就会发生变化。只有两个项目(均以'1'开头),按'1'会使ListBox将所选项目从索引0切换到索引1(反之亦然)。

我已经尝试了一下,这就是我发现的。

  • 这只发生在按'1'时。没有其他数字,数字或标点符号会导致此问题。这将发生在ListBox项开头的任何字符。
  • 如果ListBox有两个以上的项目,它将循环显示所有先前输入的具有相同起始字符的元素。将跳过从未选择过的项目。

我尝试过的:

  • 清除所选索引 ListBox.SetSelected(int index, bool selected)
  • 清除所选索引 ListBox.ClearSelected()
  • 设置Listbox.SelectionModeSelectionMode.One

我使用的是VS 2015 Professional,Windows 7 SP1(x64),C#6.0和.NET 4.6.1。

所以,我的问题:发生了什么,我该如何解决?

EN

回答 2

Stack Overflow用户

发布于 2019-01-04 09:18:52

如果Listbox在焦点时键入任何键盘键,它实际上遍历其所有项目并选择以键入键开头的那些项目(逐个)。所以这是基本的行为Listbox

你需要在这里使用KeyEventArgs.SuppressKeyPress属性,因为你需要在这样的事件中编写你的逻辑KeyEvenArgs,比如KeyDown

尝试以下代码

代码语言:javascript
复制
    private void lstBoxItems_KeyDown(object sender, KeyEventArgs e)
    {
        ListBox lbx = (ListBox)sender;
        if (lbx.SelectedIndices.Count != 1)
            return;

        e.SuppressKeyPress = true;

        //calling this method to get char from key data
        char keyChar = GetChar(e);

        int temp = lbx.SelectedIndex;
        string value = lbx.Items[temp].ToString();
        value += keyChar;

        lbx.Items[temp] = value;
    }

并添加此方法

代码语言:javascript
复制
    char GetChar(KeyEventArgs e)
    {
        int keyValue = e.KeyValue;
        if (!e.Shift && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
            return (char)(keyValue + 32);
        return (char)keyValue;
    }

我搜索的其他一些问题,你可以参考,

按键时如何禁用列表框自动选择项

我有从这里将关键数据转换为char的方法。

获取Control.KeyDown上的char?

票数 0
EN

Stack Overflow用户

发布于 2019-01-04 10:08:57

感谢Amit指出我正确的方向。这是ListBox的默认行为。但是,实际上有一种更简单的方法可以使用我正在使用的事件处理程序来抑制此行为。

当使用事件处理程序“按键响应”,可以设置 e.Handled = true 以抑制进一步的处理。这可以防止Listbox在键入时选择其他项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档