2009-03-20 11 views
1

Ich bin gerade dabei, mich mit dem Konzept eines Benutzersteuerelements vertraut zu machen.Zurückgeben von Informationen von einem Benutzersteuerelement

Ich habe ein UserControl erstellt, um eine Anzahl von Steuerelementen zu gruppieren, die auf einzelnen Seiten eines TabControl dupliziert wurden.

Einige dieser Steuerelemente sind Textfelder, die eine Überprüfung erfordern, und wenn die Validierung nicht erfolgreich ist, muss eine Fehlermeldung angezeigt werden. Der Ort, an dem die Fehlermeldung angezeigt werden soll, befindet sich jedoch in der Statusleiste des Hauptformulars.

Wie kann die Validierung/Fehleranzeige in dieser Situation am besten gehandhabt werden?

+0

Checkout: [Wie UserControl validiert?] (Http://izlooite.blogspot.com/2010/07/how-to-validate-user-control.html) –

Antwort

4

Zur Validierung Sie eines dieser handhaben:

  • Validate mit einem Verfahren in der Steuer Benutzer
  • Ihre Benutzerkontrolle haben eine delegate Eigenschaft (z. B. ValidationHandler), die mit der Validierung umgehen kann (dies würde Ihnen erlauben, eine Klasse mit einem Bündel von Validatoren zu haben bei Sie zu Ihren Kontrollen)

    public delegate void Validator(...)

    public Validator ValidationHandler { get; set; }

  • Haben Sie Ihre Benutzersteuerung erzeugt eine Validierungsanforderung zuweisen könnten event (z ValidationRequested)

    public event EventHandler<ValidationEventArgs> ValidationRequested

Um das System zu benachrichtigen, dass ein Fehler aufgetreten ist einer von ihnen tun:

  • Verwenden Sie ein event Interessierte abonnieren können (zB ValidationFailed)

  • Wenn das Objekt Das führt die Validierung (über die delegate oder event) ist auch die, aus der Sie die Fehlermeldung generieren möchten, kann es die Fehlermeldung selbst auslösen.

EDIT:

Da Sie gesagt haben Sie in Ihrem Steuer bestätigen würde, könnte der Code für eine ValidationFailed Ereignis wie folgt aussehen:

// In your user control 

public class ValidationFailedEventArgs : EventArgs 
{ 
    public ValidationFailedEventArgs(string message) 
    { 
     this.Message = message; 
    } 

    public string Message { get; set; } 
} 

private EventHandler<ValidationFailedEventArgs> _validationFailed; 
public event EventHandler<ValidationFailedEventArgs> ValidationFailed 
{ 
    add { _validationFailed += value; } 
    remove { _validationFailed -= value; } 
} 

protected void OnValidationFailed(ValidationFailedEventArgs e) 
{ 
    if(_validationFailed != null) 
     _validationFailed(this, e); 
} 

private void YourValidator() 
{ 
    if(!valid) 
    { 
     ValidationFailedEventArgs args = 
     new ValidationFailedEventArgs("Your Message"); 
     OnValidationFailed(args); 
    } 
} 

// In your main form: 

userControl.ValidationFailed += 
    new EventHandler<ValidationFailedEventArgs>(userControl_ValidationFailed); 

// ... 
private void userControl_ValidationFailed(object sender, 
              ValidationFailedEventArgs e) 
{ 
    statusBar.Text = e.Message; 
} 
+0

+1 Ich mag diese Antwort wirklich. Ich denke, es ist ein bisschen involviert, ein Link zu einer Referenzimplementierung/Artikel oder etwas wäre großartig, um es in Gang zu bringen – eglasius

+0

Ich validiere aus dem Benutzercontrol - das funktioniert ganz gut. Ich muss nur die Fehlermeldung auf dem Hauptformular angezeigt bekommen. Können Sie mir in die richtige Richtung zeigen, wie Sie ein Ereignis definieren und das Abonnement verwalten? – phrenetic

+0

Verwenden Sie ein ValidationFailed-Ereignis, das Hauptformular kann das Ereignis behandeln –

0

Sie können entweder einen Validator auf das Benutzersteuerelement selbst setzen, eine Ausnahme auslösen oder öffentliche Getters zu den Feldern hinzufügen, die im übergeordneten Formular angezeigt werden sollen.

+0

@Crhis eine Ausnahme werfen? – eglasius

+0

In der Tat. Eine Ausnahme wäre ein bisschen Ewwwwwwww. – Quibblesome

+0

@QuarcelSome nicht nur, dass das Benutzersteuerelement beim Laden oder einem anderen Seitenereignis überprüft wird, würde es tatsächlich die gesamte Seite fehlschlagen. -1 – eglasius

0

Erstellen Sie eine öffentliche Methode für Ihre Benutzersteuerung, die ihr Feld überprüft, und Sie können einen String-Ausgabeparameter übergeben.

so etwas wie

public bool IsValid(out string status) 
{ 
// do validation and set the status message 
} 
1

Wenn Sie das tun Validierung im UserControl, können Sie ein öffentliches ValidationFailed-Ereignis anbieten und die Nachricht in die EventArgs aufnehmen. Das übergeordnete Steuerelement könnte dann das ValidationFailed-Ereignis abonnieren und die Statusleiste aktualisieren.

+0

Könnten Sie das für mich erweitern? Ich bin ziemlich neu in C# und bin mir nicht sicher, wie Sie das tun würden. Alle Hilfe wurde dankbar angenommen. – phrenetic

+0

@phrenetisch siehe Daniels Update, es ist dasselbe – eglasius

0

Sie können ASP.net-Validatoren in den Benutzersteuerelementen verwenden, und eine Validierungszusammenfassung auf dem Hauptformular und es wird die Fehler für Sie auflisten.

Für andere Verwendungszwecke können Sie ein Ereignis verfügbar machen und die Seite, die das Steuerelement enthält, für das Ereignis abonnieren und die erforderlichen Maßnahmen ergreifen.

Verwandte Themen