我正在使用ListBox创建一个应用程序。我希望用户能够点击它,开始输入,并看到他们的文字出现在该项目中。下面是一个几乎可以工作的简化版本:
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')时,ListBox的所选项目就会发生变化。只有两个项目(均以'1'开头),按'1'会使ListBox将所选项目从索引0切换到索引1(反之亦然)。
我已经尝试了一下,这就是我发现的。
我尝试过的:
ListBox.SetSelected(int index, bool selected)
ListBox.ClearSelected()
Listbox.SelectionMode
为SelectionMode.One
我使用的是VS 2015 Professional,Windows 7 SP1(x64),C#6.0和.NET 4.6.1。
所以,我的问题:发生了什么,我该如何解决?
发布于 2019-01-04 09:18:52
如果Listbox
在焦点时键入任何键盘键,它实际上遍历其所有项目并选择以键入键开头的那些项目(逐个)。所以这是基本的行为Listbox
。
你需要在这里使用KeyEventArgs.SuppressKeyPress属性,因为你需要在这样的事件中编写你的逻辑KeyEvenArgs
,比如KeyDown
尝试以下代码
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;
}
并添加此方法
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的方法。
发布于 2019-01-04 10:08:57
感谢Amit指出我正确的方向。这是ListBox的默认行为。但是,实际上有一种更简单的方法可以使用我正在使用的事件处理程序来抑制此行为。
当使用事件处理程序“按键响应”,可以设置 e.Handled = true
以抑制进一步的处理。这可以防止Listbox在键入时选择其他项目。
https://stackoverflow.com/questions/-100008947
复制相似问题