Je me rends compte de ce fil est assez vieux, mais je pensais que je poste la solution je suis venu avec.
Le plus gros problème avec la validation sur WinForms est la validation n'est exécuté que lorsque le contrôle a "perdu le focus". Ainsi, l'utilisateur a de fait, cliquez à l'intérieur d'une zone de texte, puis cliquez quelque part d'autre pour la validation de routine à exécuter. C'est très bien si votre uniquement préoccupés par les données d'entrée est correcte. Mais cela ne fonctionne pas bien si vous essayez de faire en sorte qu'un utilisateur n'a pas laisser une zone de texte vide en sautant dessus.
Dans ma solution, lorsque l'utilisateur clique sur le bouton submit d'un formulaire, je vérifie chaque contrôle du formulaire (ou autre conteneur est spécifié) et utiliser la réflexion pour déterminer si une validation de la méthode est définie pour le contrôle. Si elle l'est, la méthode de validation est exécutée. Si une validation échoue, la routine renvoie une erreur et permet l'arrêt du processus. Cette solution fonctionne bien surtout si vous avez plusieurs formulaires pour valider.
1) il suffit de copier et coller cette section de code à votre projet. Nous sommes à l'aide de la Réflexion que vous avez besoin d'ajouter du Système.Refelection à votre utilisation de déclarations
class Validation
{
public static bool hasValidationErrors(System.Windows.Forms.Control.ControlCollection controls)
{
bool hasError = false;
// Now we need to loop through the controls and deterime if any of them have errors
foreach (Control control in controls)
{
// check the control and see what it returns
bool validControl = IsValid(control);
// If it's not valid then set the flag and keep going. We want to get through all
// the validators so they will display on the screen if errorProviders were used.
if (!validControl)
hasError = true;
// If its a container control then it may have children that need to be checked
if (control.HasChildren)
{
if (hasValidationErrors(control.Controls))
hasError = true;
}
}
return hasError;
}
// Here, let's determine if the control has a validating method attached to it
// and if it does, let's execute it and return the result
private static bool IsValid(object eventSource)
{
string name = "EventValidating";
Type targetType = eventSource.GetType();
do
{
FieldInfo[] fields = targetType.GetFields(
BindingFlags.Static |
BindingFlags.Instance |
BindingFlags.NonPublic);
foreach (FieldInfo field in fields)
{
if (field.Name == name)
{
EventHandlerList eventHandlers = ((EventHandlerList)(eventSource.GetType().GetProperty("Events",
(BindingFlags.FlattenHierarchy |
(BindingFlags.NonPublic | BindingFlags.Instance))).GetValue(eventSource, null)));
Delegate d = eventHandlers[field.GetValue(eventSource)];
if ((!(d == null)))
{
Delegate[] subscribers = d.GetInvocationList();
// ok we found the validation event, let's get the event method and call it
foreach (Delegate d1 in subscribers)
{
// create the parameters
object sender = eventSource;
CancelEventArgs eventArgs = new CancelEventArgs();
eventArgs.Cancel = false;
object[] parameters = new object[2];
parameters[0] = sender;
parameters[1] = eventArgs;
// call the method
d1.DynamicInvoke(parameters);
// if the validation failed we need to return that failure
if (eventArgs.Cancel)
return false;
else
return true;
}
}
}
}
targetType = targetType.BaseType;
} while (targetType != null);
return true;
}
}
2) l'Utilisation de la norme de la Validation de l'événement sur tout le contrôle que vous souhaitez valider. Assurez-vous d'utiliser l'e.Annuler lors de la validation échoue!
private void txtLastName_Validating(object sender, CancelEventArgs e)
{
if (txtLastName.Text.Trim() == String.Empty)
{
errorProvider1.SetError(txtLastName, "Last Name is Required");
e.Cancel = true;
}
else
errorProvider1.SetError(txtLastName, "");
}
3) de Ne pas sauter cette étape! Définir la AutoValidate bien sur la forme de EnableAllowFocusChange. Cela permettra de tabulation à un autre contrôle, même si la validation échoue.
4) Enfin, votre Bouton Soumettre méthode, l'appel de la méthode de Validation et de spécifier ce conteneur que vous souhaitez vérifier. Il peut être l'ensemble de la forme, ou tout simplement un conteneur sur la forme comme un Panneau ou d'un Groupe.
private void btnSubmit_Click(object sender, EventArgs e)
{
// the controls collection can be the whole form or just a panel or group
if (Validation.hasValidationErrors(frmMain.Controls))
return;
// if we get here the validation passed
this.close();
}
Amusez-Vous Bien!