2012-04-11 13 views
0

Ich habe WinForms App und mehrere Formulare und wollen ErrorProvider Komponente auf jedem von ihnen EDIT: verwenden, um zu überprüfen, ob die Benutzereingabe in Ordnung ist (zum Beispiel wenn die eingegebene Nummer im Bereich etc ...) Es scheint mir nutzlos diese Komponente auf jedes Formular fallen zu lassen. Was, wenn ich ein globales Objekt (oder wie man es nennt) machen und es auf jedem Formular benutzen?Globale Objekte oder nicht?

Meine Idee:

namespace MyApplication { 
static class Program { 

public static ErrorProvider EP = new ErrorProvider(); 
... 

Und dann in dieser individuellen Form Validating und Validated Ereignisse zu behandeln:

private void txtBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) { 
    if (txtBox1.Text != "correct text") { 
    e.Cancel = true; 
    Program.EP.SetError(txtBox1, "You have error in your input"); 
... 

Ist der richtige Ansatz oder soll ich es irgendwie sonst tun?

Und wenn ich mehr globale Objekte brauchen, vielleicht sollte ich sie alle zusammen zu einem gewissen separaten statische Klasse setzen und in der Program schaffen nur diese eine (?)
Danke.

+0

Wofür verwenden Sie den ErrorProvider? Wird es Staat halten? – Oded

+0

Frage bearbeitet ... – Enriqe

Antwort

0

Ich denke, Sie können eine neue Klasse erstellen, die Textbox Klasse erbt und Ihre Validierungen dort hinzufügen, dann erstellen Sie ein neues Steuerelement, das Ihre Klasse ist und verwenden Sie wo immer Sie brauchen, in diesem Fall werden Sie Ihre Validierungen bearbeiten/ändern ein Ort später.

I f Sie sehr unterschiedliche Validierungen haben erstellen 2 Klassen zum Beispiel: NumericTextBox und StringTextBox

1

Dieser Ansatz ist so lange gültig, wie Ihre einzelnen Formulare nicht gleichzeitig ausgeführt werden oder Ihr Fehleranbieter erneut auftritt und Ihr Fehleranbieter keine permanente Verknüpfung zu Ihren Formularen benötigt. In dem Beispiel, das Sie angezeigt haben, scheint es, dass Ihr Anbieter das Steuerelement übergeben muss, auf dem der Fehlerstatus festgelegt werden soll, sodass die Wahrscheinlichkeit groß ist, dass er erneut eintritt.

1

Es ist ok globales Objekt haben, aber ich würde lieber macht es zu einer statischen staatenlos Klasse, wenn möglich. Staatenlosigkeit ermöglicht eine einfache Fadensicherheit. Es ist in .NET üblich, globale (im Namespace) statische Klassen zu haben, zum Beispiel FileInfo oder Convert.

Wenn Sie nur ein paar globale Methoden benötigen und sie auf UI-Elementen arbeiten, können Sie auch einige Erweiterungsmethoden für oder sogar System.Windows.Controls.TextBox schreiben, wenn das die einzige Kontrolle ist, die Sie wollen. Dies wird Ihnen ein bisschen schöner Code:

txtBox1.Validate("correct text", "You have error in your input"); 

Erweiterung Methode könnte wie folgt aussehen:

public static class MyExtension 
{ 
    public static void Validate(this TextBox myTextBox, string correctText, string error) 
    { 
     if(myTextBox.Text != correctText) 
      Console.WriteLine(string.Format("{0} [{1} == '{2}']", error, myTextBox.Name, myTextBox.Text)); 
    } 
} 

Welche Sie diese Meldung in der Konsole geben würde:

You have error in your input [txtBox1 == 'some text']

Blick bei Erweiterungsmethoden documentation, wenn Sie weitere Informationen benötigen.

+0

Super, danke! – Enriqe

+1

@Enriqe, Sie können immer ändern, was Sie als die beste Antwort auf Ihre Frage ausgewählt haben :-) –

+0

: D Ja, Sie haben Recht.Ich mag die Idee, Erweiterung einer grundlegenden Komponente zu schreiben, ich weiß, dass Sie es auch geschrieben haben, aber @Ali Issa war zuerst, trotzdem danke für meine Stimmung :) Einen schönen Tag und .... sorry;) – Enriqe

Verwandte Themen