Como determinar se o TextChanged foi acionado pelo teclado em C#?
-
26-09-2019 - |
Pergunta
Eu tenho um método
private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e)
{ ... }
onde a caixa de texto em questão pega uma sequência de pesquisa do usuário e preenche um ListBox
com os resultados em cada pressionamento de teclas.
Posteriormente, quando um item é escolhido do ListBox
, Eu gostaria da escolha refletida no mesmo Textbox
. No entanto, não quero acionar o mecanismo de pesquisa, o que causaria o Listbox
para esquecer sua seleção.
Como posso determinar se o TextChanged
O evento foi acionado pelo usuário (via teclado ou talvez copiar/colar) ou por outro método usando textBoxPilot.Text = "Pilot name";
?
Obrigado.
Solução
um pouco de hack, mas ....
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.
}
}
Outras dicas
Um controle desativado não será demitido de um evento. Portanto, duas opções são sempre desativando a atualização do texto e depois criam um invólucro de classe derivado (usando este método que você ainda pode fazer a ligação de dados)
class myClass : TextBox
{
public virtual string TextWithoutEvents
{
get
{
return base.Text;
}
set
{
bool oldState = Enabled;
Enabled = false;
base.Text = value;
Enabled = oldState;
}
}
}
Se o usuário selecionar "Nome do piloto" na lista, você define a caixa de texto como "Nome do piloto". Isso fará com que a caixa de listagem selecione "Nome do piloto". Portanto, a seleção deve ser mantida. Você só precisa quebrar a recursão.