[英]How to determine whether TextChanged was triggered by keyboard in C#?
我有一個方法
private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e)
{ ... }
有問題的文本框從用戶那里獲取一個搜索字符串,並在每次擊鍵時用結果填充一個ListBox
。
隨后,當從ListBox
選取一個項目時,我希望該選擇反映在同一個Textbox
。 但是,我不想觸發搜索機制,這會導致Listbox
忘記其選擇。
如何確定TextChanged
事件是由用戶(通過他們的鍵盤或復制/粘貼)還是由其他使用textBoxPilot.Text = "Pilot name";
方法textBoxPilot.Text = "Pilot name";
?
謝謝。
有點黑客,但是......
public class MyForm : Form
{
private bool _ignoreTextChanged;
private void listView1_SelectionChanged( object sender, EventArgs e )
{
_ingnoreTextChanged = true;
textBoxPilot.Text = listView1.SelectedValue.ToString(); // or whatever
}
private void textBoxPilot_TextChanged( object sender, TextChangedEventArgs e )
{
if( _ignoreTextChanged )
{
_ignoreTextChanged = false;
return;
}
// Do what you would normally do.
}
}
禁用的控件不會觸發事件。 所以有兩個選項要么總是禁用更新文本然后重新啟用要么創建派生類包裝器(使用此方法您仍然可以進行數據綁定)
class myClass : TextBox
{
public virtual string TextWithoutEvents
{
get
{
return base.Text;
}
set
{
bool oldState = Enabled;
Enabled = false;
base.Text = value;
Enabled = oldState;
}
}
}
如果用戶從列表中選擇“Pilot name”,則將文本框設置為“Pilot name”。 這將導致列表框選擇“飛行員名稱”。 所以應該保留選擇。 你只需要打破遞歸。
在我的場景中,用戶必須輸入文本以觸發自動完成,並且我們不希望在自動完成再次更改文本時重新觸發,我使用了文本長度。 如果用戶復制/粘貼並因此使用鍵盤一次添加 1 個以上的字符,這將不起作用。
private void HandleTextChanged(object sender, TextChangedEventArgs e){
var oldText = e.OldTextValue;
var newText = e.NewTextValue;
// Assuming text changed from keyboard is always 1 character longer,
// ignore this text changed event if new text > 1 character longer.
if (newText.Length > oldText.Length + 1) {
return;
}
...
}
在您的場景中,如果您始終知道要跳過的值,則可以改為檢查它們:
if (newText == "Pilot name") {
return;
}
或
if (myListOfNamesToIgnore.Contains(newText)) {
return;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.