2010-04-06 9 views
3

Est-il possible de savoir si l'une des valeurs de la zone de texte a changé dans l'application? J'ai environ 30 textboxes et je veux exécuter une partie du code seulement si, n'importe quelle valeur de textboxes a changé sur le 30. Est-ce que je peux le savoir.Valeur de la zone de texte modifiée

Répondre

7

Chaque zone de texte déclenche un événement TextChanged lorsque son contenu a été modifié. Cependant, cela vous oblige à vous abonner à chaque événement. La bonne nouvelle est que vous pouvez vous abonner à l'événement avec la même méthode plusieurs fois. Le gestionnaire a un paramètre sender que vous pouvez utiliser pour déterminer laquelle de vos 30 zones de texte a réellement déclenché l'événement.

Vous pouvez également utiliser les événements GotFocus et LostFocus pour suivre les modifications réelles. Vous devez stocker la valeur d'origine sur GotFocus, puis la comparer à la valeur actuelle sur LostFocus. Cela contourne le problème de deux événements TextChanged qui s'annulent mutuellement.

+0

La question était "avoir les valeurs ont changé" non « a Événement TextChanged déclenché ". Si un utilisateur édite le texte "banana" sur "bananaX" puis appuie sur backspace, il revient à "banana" ... et rien n'a changé. La détection de manque est absente des contrôles WPF ... – Jack

+0

@Jack - Ajout d'une solution possible pour cela. – ChrisF

+0

Si vous utilisez MVVM + Binding, il n'y a pas de moyen facile de le faire dans WPF car la classe Binding (qui est parfaitement placée pour détecter les modifications en cours) ne ... – Jack

2

Vous pouvez affecter un gestionnaire d'événements à chacun des événements TextChanged de la zone de texte. Tous peuvent être affectés au même gestionnaire d'événements dans le code. Ensuite, vous saurez quand le texte change. Vous pouvez définir un champ d'indicateur booléen dans votre classe pour enregistrer qu'une modification s'est produite.

1

essayez ceci. Ajoutez ce code au chargement/constructeur. pas besoin de spécifier l'événement dans le XAML explicitement

this.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(TextChanged)); 
private void TextChanged(object Sender, TextChangedEventArgs e) 
{ 
    //ToDO (use sender to identify the actuale text from where it fired } 
} 
1

Ceci est peut-être du côté rugueux et prêt, mais je l'ai fait de cette façon.

Dans le constructeur, j'ai créé

bool bChanged = false;

Dans le gestionnaire d'événements TextChanged de chaque contrôle (en fait de même pour chacun), je mets

bChanged = true; Le cas échéant, je pourrais effectuer un traitement et redéfinir bChanged à false.

1

Vous pouvez également faire ceci:

Dans votre Constructor:

MyTextBox.TextChanged += new TextChangedEventHandler(TextChanged); 

Et cette méthode:

private void TextChanged(object Sender, TextChangedEventArgs e){ 
      //Do something 
     } 
Questions connexes