【发布时间】:2012-01-21 18:19:08
【问题描述】:
我正在尝试过滤ListView 中的项目列表,因为用户键入TextBox 并且我使用KeyDown 和KeyPress 事件但是当我阅读textbox.Text 时,它总是返回最后一次按键之前的文本。有没有办法在不按 Enter 的情况下始终获取 TextBox 中显示的任何内容?
【问题讨论】:
我正在尝试过滤ListView 中的项目列表,因为用户键入TextBox 并且我使用KeyDown 和KeyPress 事件但是当我阅读textbox.Text 时,它总是返回最后一次按键之前的文本。有没有办法在不按 Enter 的情况下始终获取 TextBox 中显示的任何内容?
【问题讨论】:
使用TextBox.TextChanged 事件(继承自Control)。
在 Text 属性值更改时发生。
我的建议是尽量不要使用关键事件(向下/按下/向上)来破解它 - 还有其他方法可以更改文本框的文本,例如从右键单击上下文菜单中粘贴文本。这不涉及按键。
【讨论】:
您可以使用相关文本框的TextChanged 事件。我认为KeyUp 事件可能也会起作用。
【讨论】:
关于实际的原始问题,先前的答案是不完整的:当用户刚刚按下一个键(包括该按键)时,如何检索 Text 属性的内容?
KeyUp 事件恰好在 AFTERText 属性的内容实际更改后触发,因此使用此特定事件顺序,您可以检索文本内容的最新值使用KeyUp 事件处理程序。
KeyPress 事件不起作用,因为它在Text 属性更改之前被触发。
【讨论】:
【讨论】:
public static string NextControlValue(string originalValue, int selectStart, int selectLength, string keyChar)
{
if (originalValue.Length > selectStart)
{
if (selectLength > 0)
{
originalValue = originalValue.Remove(selectStart, selectLength);
return NextControlValue(originalValue, selectStart, 0, keyChar);
}
else
{
return originalValue.Insert(selectStart, keyChar);
}
}
else
{
return originalValue + keyChar;
}
}
var previewValue = NextControlValue(textbox.Text, textbox.SelectionStart, textbox.SelectionLength, e.KeyChar + "");
【讨论】:
您可以尝试 KeyPress 事件:
int position = textBox1.SelectionStart;
string changedText = textBox1.Text.Insert(position, e.KeyChar.ToString());
【讨论】: