2010-09-02 3 views
2

J'ai une méthodeComment déterminer si TextChanged a été déclenché par le clavier en C#?

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 frappe.

Par la suite, quand un article est choisi à partir du ListBox, je voudrais que le choix reflète dans le même Textbox. Cependant, je ne veux pas déclencher le mécanisme de recherche, ce qui provoquerait l'Listbox d'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.

Répondre

1

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. 
    } 
} 
+0

J'ai fini par utiliser une combinaison de votre réponse et de la réponse de Scott: private void listBoxPilot_SelectionChanged (expéditeur d'objet, SelectionChangedEventArgs e) { textBoxPilot.IsEnabled = false; Membre sélectionnéPilot = (Membre) listBoxPilot.SelectedItem; textBoxPilot.Text = selectedPilot.firstName; textBoxPilot.IsEnabled = true; } private void textBoxPilot_TextChanged (expéditeur d'objet, TextChangedEventArgs e) { if (textBoxPilot.IsEnabled == false) retour; [recherche] } Ceci élimine le besoin d'une nouvelle variable globale. Merci à vous deux. – Anders

0

Si l'utilisateur sélectionne "Nom du pilote" dans la liste, définissez la zone de texte sur "Nom du pilote". Cela entraînera la zone de liste pour sélectionner "Nom du pilote". Donc, la sélection devrait être conservée. Vous devez juste casser la récursivité.

+0

est vrai, cependant, il est un non-droit dans ce cas. L'utilisateur tapera occasionnellement à travers les résultats en utilisant les touches fléchées, et le ListBox sélectionne chaque élément comme ils vont. – Anders

1

Un contrôle désactivé ne se déclenche pas un événement. Donc, deux options sont soit désactiver toujours mettre à jour le texte puis réactivez ou créer une enveloppe 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; 
     } 
    } 
} 
+0

Merci pour l'inspiration. En fin de compte, j'ai utilisé une combinaison de votre réponse et de la réponse de Jerod; voir ma réponse à son message. – Anders

Questions connexes