Ist es OK, um eine überlastung ShowDialog() so, dass ein Kind die form der Informationen liefert als ein out-parameter?
In einer früheren Frage über gewusst wie: zurückgeben einer Zeichenfolge aus einem dialog-Fenster, yapiskan vorgeschlagen überlastung des untergeordneten Formulars ShowDialog () - Methode, um einen out-parameter.
Meine Frage ist, ob oder nicht, das ist ein guter Ansatz in C#.
Hier finden Sie einige Beispiel-code, basierend auf yapiskan Vorschlag. In der child-form (in diesem Beispiel, es ist eine form mit einer textbox drauf), müssen Sie nur fügen Sie die ShowDialog-überlast-und ordnen Sie UI-Werte der out-parameter:
public DialogResult ShowDialog(out string s)
{
DialogResult result = this.ShowDialog();
s = this.textBox1.Text;
return result;
}
Und zeigen Sie das Formular, und rufen Sie die Eingabe von text, Sie dies tun:
using (CustomDialog frm = new CustomDialog())
{
string s;
if (frm.ShowDialog(out s) == DialogResult.OK)
{
//do something with s
}
}
Einen Vorteil, den ich mir vorstellen kann ist, dass dieser Ansatz zwingt den Benutzer, der CustomDialog Formular aus, um die Informationen, die es enthält, durch die form der ShowDialog-Methode (anstelle von einem wer-weiß-was-es-genannt-Methode wie GetMyData() oder so).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besser eine Öffentliche Eigenschaft/Methode und Holen Sie sich die Informationen.
Was würden Sie tun, wenn Sie müssen 3..4..5 Informationen, mit 5 Parametern aus? Mehr sauber zu haben Accessoren, um Ihre Informationen aus dem Dialog.
Sollte es nicht OK sein, da .net framework verwenden, die nicht mit diesem design. Im Fall der OpenFileDialog-Klasse, es hat einen parameterlosen ShowDialog () - Methode der Rückkehr ein DialogResult. Sobald diese Methode aufgerufen, die die Benutzer sollen, um die ausgewählten Dateien mit den Dateinamen, die Dateinamen, SafeFileName und SafeFileNames Methoden.
Lassen Sie uns davon ausgehen, dass diese implented in der "out-parameter" Weg. Hätte ich code schreiben, nur um die SafeFileName:
Ich persönlich versuchen zu vermeiden, out-Parameter, wo immer möglich, obwohl ich verstehe, dass wie die GoTo-Sie sind manchmal ein notwendiges übel. Ich würde sagen, dass es viel besser wäre, verwenden Sie die Eigenschaften oder Methoden, um die Informationen zurückgeben.
In meiner Erfahrung, eine benutzerdefinierte modalen dialog, der sammelt nur eine information ist eine ziemlich extreme Ausreißer. Viel häufiger sind null und viele.
Dialog und sammelt viele Stücke von Daten, ist es fast sicher geändert werden, an einem gewissen Punkt zu sammeln, nur einer mehr. Ich würde viel lieber fix nur der code, der verwendet, dass ein neues Stück von Daten als jedes einzelne Stück code, der verwendet einen modifizierten dialog.
Auch darüber nachdenken, wie ein Entwickler verwendet IntelliSense, um Ihre Klasse. Er geht, um zu geben diese:
...und bei diesem letzten Tastendruck, IntelliSense erscheint, sagen Sie ihm, dass er jetzt hat, zu erklären, drei neue string-Variablen zur Aufnahme der out-Parameter. Also er bewegt den cursor nach oben, und beginnt zu schreiben:
...und, wie war der name des zweiten Parameters wieder? Also, zurück nach unten auf die offene Klammer, drücken Sie STRG+LEERTASTE, oh ja, es ist
bar
, zurück in die Vorherige Zeile, etc.Das problem bei der Verwendung von Eigenschaften, die auf einem benutzerdefinierten Dialogfeld ist, dass die Form-Klasse verfügt bereits über eine Millionen Eigenschaften, und die drei oder vier besonderen, die Sie erstellen, gehen verloren in der Mischung. Um dies zu beheben, erstellen einer Klasse für das Dialogfeld Parameter und eine
Parameters
Eigenschaft dieses Typs auf das benutzerdefinierte Dialogfeld. Das macht den code einfach zu schreiben:da die Namen der parameter pop-up in IntelliSense, und Sie brauchen nicht zu deklarieren jede Variable, die halten Ihre Werte.
Mein Ansatz ist in der Regel schreiben Sie eine Methode, die intern ShowDialog Aufrufe, dann formatiert die Ausgabe von Daten entsprechend. Für die (ausgedachte) Beispiel:
In den meisten Fällen kann ich diese Methode statisch ist, und instanziieren der dialog selbst von innerhalb des Körpers von der Methode - so dass der Anrufer nicht zu tun haben mit der form verweist oder die Vorstellung von zur Wahl mit dem 'show' - Methode aufrufen.
In der non-edge-Fällen mit mehreren output-Werte, die ich in der Regel bauen eine Struktur, die Sie hält diese Werte, dann haben meine " Get " - Funktion zurück, die struct.
Ich bevorzuge diese ein, weil ich nicht wie den Ansatz zu bekommen, ergeben sich aus einer Eigenschaft oder einer Methode nach, die Sie getan haben mit der Klasse. Nach dem dialog-Formular gezeigt wurde geschlossen und ich denke, das Objekt sollte nicht mehr verwendet werden, weil logischerweise die Sie getan haben mit dem dialog, warum sollte ich dann verwenden, seine Eigenschaft oder Methode um das Ergebnis zu erhalten?
@Musigenesis, Sie wirklich nicht wollen, zu zwingen, der client-code zu brechen, wenn Sie ändern Sie Ihren dialog, und mit einem out-parameter, der nur manchmal gültig, ist kein gutes design. Wie @Daok sagt, wenn Sie mehr als 1 Wert, der zurückgegeben wird beginnt diese zu erhalten, chaotisch und hässlich schnell.
Kann man auch nicht erzwingen, dass der client-code zu verwenden das Ergebnis mehr als das .net framework stellt sicher, dass Sie rufen Sie die Eigenschaften auf ein Datei-dialog. Du bist auch nicht, daß der Anrufer etwas zu tun mit der out-parameter, alle, die Sie haben Sie gezwungen, Sie zu akzeptieren eine variable, die Sie möglicherweise nicht verwenden wollen.
Wenn der dialog ist sehr allgemein kann dies nicht anwendbar sein, aber statt die Ausdehnung aller Arten von Eigenschaften, um das Dialogfeld selbst, eine einzelne Methode, die Sie verwenden konsequent in Ihrer Anwendung, und haben, die eine bestimmte Klasse enthält die relevanten Daten.
und Ihr dialog ist
Die Essenz ist eine kleine, unveränderliche utility-Klasse, die implementiert auch null-Objekt-pattern. Das null-Objekt wird zurückgegeben, wenn der dialog Ergebnis war nicht OK. Offensichtlich ist die oben ist ein Schuss im Dunkeln für Ihre Bedürfnisse, so ändern Sie es am Willen, machen Vererbung Hierarchien, etc.
Der wichtigste Punkt ist
GetDialogResult()
, eine einzige Methode auf dem Dialogfeld, um die Rückgabe einer Klasse kapselt alle relevanten dialog-Daten.edit:
@yapiskan fragt sich, warum nicht einfach 'out' der
MyDialogResult
versus BerufungGetDialogResult()
.IMO - Die Punkte sind ganz einfach:
out
ist umständlich zu bedienen.GetDialogResult()
ist nicht, daß der Anrufer zu schreiben, umständlich-code, und es nicht zwingen den Nutzer zum konsumieren der dialog, Ergebnis an der Stelle der Berufung auf den dialog.Die Realität ist, du bist trading einen Methodenaufruf für eine peinliche ShowDialog () - syntax. Methodenaufrufe sind Billig, und Sie können nicht garantieren, dass der Aufrufer verwenden Sie Ihre out-parameter mehr, als Sie können dafür garantieren, rufen Sie GetDialogResult(). Warum also die Mühe. Um die Sache einfach zu verwenden, oder nicht überlasten ShowDialog in den ersten Platz.
Vielleicht, was auch immer Sie sind sub-classing ist funky und Handlungen unterschiedlich und es ist nicht auf Ihre situation zutrifft, aber allgemeiner design-Formen gehen nicht Weg, wenn Sie auf OK klicken, gehen Sie Weg, wenn Sie Entsorgt() von.