2008-11-01 1 views
2

J'ai besoin d'une boîte de dialogue modale pour rassembler certaines entrées utilisateur. J'ai alors besoin des mêmes données à consommer par l'application MainFrame.Quel est le meilleur moyen de transmettre des données entre une MainFrame (ou Main Dialog) et une boîte de dialogue modale?

Habituellement, mon dialogue modal aurait un pointeur vers un DataType capable de stocker ce dont j'ai besoin, et je passerais cet objet par référence de MainFrame afin de pouvoir récupérer les données une fois que le dialogue modal est fermé par l'utilisateur.

Est-ce le meilleur moyen de transmettre des données?

Ce n'est pas normal!

Répondre

3

Puisque vous transmettez des données une fois que l'utilisateur a fermé le dialogue (probablement sur DialogResult.OK), vous pouvez facilement le faire sans avoir de référence MainFrame. Donc, disons que vous avez un TextBox dans votre boîte de dialogue, appelé userNameTextBox et un bouton qui termine le dialogue avec le résultat OK. Vous pouvez soit rendre public le nom UserTextBox (non recommandé), soit ajouter une propriété pour renvoyer le texte.

public string UserName 
{ 
    get { return userNameTextBox.Text; } 
} 

Et pour obtenir cette valeur après la boîte de dialogue est terminée, vous venez de faire:

Dialog dialog = new Dialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    string username = dialog.UserName; 
} 
+0

choisiriez-vous cette approche - qui est une version plus propre de ce que je propose - sur la communication basée sur l'événement? – JohnIdol

+0

Je penche vers cette solution – JohnIdol

0

Normalement, vous pouvez utiliser une classe unique ou un autre type de données pour transférer des données. Ainsi, le dialogue est utilisé pour modifier les propriétés de la classe. Pourquoi est-ce que ça ne va pas? Avec l'ordinateur central, je suppose que vous ne voulez pas dire les grands ordinateurs anciens (bien que toujours vivants). Sinon, je pense que TCP/IP sera un bon choix. [/ humour]

+0

ne me semble pas correct parce que de cette façon, je suis coupler des objets frontières – JohnIdol

0

La meilleure façon d'y parvenir est de conditionner les données dans un événement et de les envoyer sur un bus d'événements.

Ceci déconnecte la boîte de dialogue de l'unité centrale - et si vous concevez l'événement correctement, cela ne vous limite pas à l'utilisation d'un dialogue.

Selon la langue et l'environnement, ce système d'événement peut être mis en œuvre facilement et à moindre coût. J'appelle ma communication inter-objets basée sur la classe de version.

+0

Exemple s'il vous plaît ... – Aheho

+0

Je cherche un moyen de découpler les objets frontières - donc cette approche sonne bien. Si je travaille sur un environnement .NET, j'imagine que j'embaquerais les données dans une sorte d'EventArgs, qu'en est-il des C++/MFC? – JohnIdol

+0

L'engouement pour le découplage doit s'arrêter, on obtient des proportions "tout ressemble à un ongle". Cette question ressemble à une simple application qui ne nécessite pas ce type de sur-ingénierie –

1

@ suggestion de Samuel est parfaitement adéquate lors de la collecte d'une ou deux valeurs de l'utilisateur.

Si vous obtenez beaucoup de valeurs, la solution dans votre question est bien aussi. Ne pas tomber dans l'optimisation prématurée et sur-concevoir une solution découplée. Par objet frontière, je suppose que vous faites référence à l'instance de structure de données référencée par le mainframe et la boîte de dialogue. Quel est le problème avec le dialogue et le mainframe référençant tous les deux cet objet? Quel est l'avantage de découpler l'objet frontière/de transfert dans ce scénario?

Le seul découplage que je pourrais voir ici serait de découpler le mainframe de l'implémentation spécifique qui lui fournit les données. Donc, plutôt que le mainframe instanciation Dialog et appel Dialog.ShowModal, l'injection de dépendance fournirait l'ordinateur central avec un IDataYouNeedGetter (qui passerait à être la même boîte de dialogue modale) et au moment opportun l'ordinateur central ferait

myGetter.SetTransferObject(dataStructInstance) 
myGetter.GoGetTheData() 
// do stuff with dataStructInstance now that myGetter set it up. 

MAIS, il n'y a aucune raison d'ajouter une couche d'indirection sauf si vous connaissez déjà un besoin spécifique pour le découplage.

+0

Par objets frontières, je veux dire les instances de classes qui représentent des éléments d'interface utilisateur (MainFrame/Dialog - etc) - mais vos considérations sont parfaitement claires. – JohnIdol

Questions connexes