Comment déterminer si TextChanged a été déclenchée par le clavier en C #?
-
26-09-2019 - |
Question
J'ai une méthode
private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e)
{ ... }
où la zone de texte en question prend une chaîne de recherche de l'utilisateur et renseigne un ListBox
avec les résultats sur chaque pression de touche.
Par la suite, lorsqu'un élément est choisi dans le ListBox
, je souhaite que le choix reflète dans le même Textbox
. Cependant, je ne veux pas déclencher le mécanisme de recherche, ce qui causerait la Listbox
oublier sa sélection.
Comment puis-je déterminer si l'événement TextChanged
a été déclenchée par l'utilisateur (via leur clavier ou peut-être copier / coller) ou par une autre méthode en utilisant textBoxPilot.Text = "Pilot name";
?
Merci.
La solution
peu un hack, mais ....
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.
}
}
Autres conseils
Un contrôle désactivé ne se déclenche pas un événement. Donc, deux options sont soit toujours désactiver la mise à jour du texte puis réactiver ou créer un wrapper de classe dérivée (en utilisant cette méthode, vous pouvez toujours faire la liaison de données)
class myClass : TextBox
{
public virtual string TextWithoutEvents
{
get
{
return base.Text;
}
set
{
bool oldState = Enabled;
Enabled = false;
base.Text = value;
Enabled = oldState;
}
}
}
Si l'utilisateur de « nom pilote » dans la liste, vous définissez la zone de texte « nom pilote ». Cela entraînera la liste pour sélectionner « nom Pilot ». Ainsi, la sélection doit être maintenue. Il vous suffit de briser la récursion.