2008-10-20 8 views
4

J'ai une zone de texte liée à la propriété d'un objet (en fait plusieurs zones de texte) sur un formulaire. Ceci est un éditeur pour un objet. Lorsque je modifie des objets et que je modifie des valeurs dans l'une des zones de texte, je ne peux pas quitter la zone de texte (ni par un onglet ni en cliquant sur une autre zone de texte). Cependant, ce n'est pas toujours le cas - lors de la modification d'autres objets (du même type), cela fonctionne très bien.TextBox lié aux données: impossible de quitter

Voici un snipet de code:

txtValue.DataBindings.Add("Text", _SourceObject, "PlannedValue", True, DataSourceUpdateMode.OnPropertyChanged, Nothing, "c") 
txtEstPlacements.DataBindings.Add("Text", _SourceObject, "EstimatedPlacementCount") 
txtReference.DataBindings.Add("Text", _SourceObject, "Reference") 

Toutes les suggestions?

Répondre

10

Cela ressemble à un problème de validation des données. Vérifiez si les propriétés du champ CausesValidation sont définies sur true ou false dans les contrôles du formulaire.

Vérifiez également la propriété AutoValidate sur le formulaire. Il est probablement défini sur EnablePreventFocusChange (qui est la valeur par défaut).

Il se peut également que la valeur fournie dans la zone de texte ne puisse pas être convertie en le type de la propriété à laquelle elle est liée sur l'objet de données source. Je crois que la classe Convert est utilisée pour cela (bien que je puisse me tromper ici).

Vous pouvez vérifier this article sur MSDN qui couvre la validation Winforms en détail.

+0

Merci! La définition de la propriété AutoValidate du formulaire sur EnableAllowFocusChange a fonctionné. – Muxa

5

Si votre formulaire a AutoValidate == EnablePreventFocusChange, vous vous retrouverez avec le focus bloqué dans tout champ dont la validation échoue.

Notez que la validation est considérée comme ayant échoué s'il existe une exception lors de l'écriture de la valeur dans l'objet. Essayez de définir un point d'arrêt au point d'entrée du setter de la propriété liée au contrôle où le curseur est bloqué. Ensuite, une seule étape pour voir si une exception est soulevée.

Si le point d'arrêt ne se déclenche jamais, l'exception peut se produire dans l'infrastructure de liaison de données.

Contrairement à la croyance populaire, le cadre de liaison de données enregistre des erreurs et d'autres informations utiles - il utilise le support de l'espace de noms System.Diagnostics pour ce faire. J'ai oublié les détails, mais ils sont sur MSDN - vous devriez être en mesure d'afficher les diagnostics dans la fenêtre des messages de Visual Studio pendant que votre application s'exécute. Très utile pour résoudre les problèmes liés à la liaison de données.

3

Pour corriger l'échec de la validation, qui est due à l'incapacité de la liaison de données à mettre DBNull.Value dans le TextBox.Text, vous pouvez ajouter la ligne suivante dans la section Form_Load:

TextBox1.DataBindings["Text"].NullValue = string.Empty; 

pour chaque zone de texte que vous souhaitez autoriser à valider la valeur vide.

See more details on Microsoft Connect.

et:

Can't escape empty textbox

Questions connexes