2013-01-04 2 views
2

Je vois beaucoup de pages et de questions impliquant la transmission d'une valeur d'un formulaire à un autre. Je voudrais faire quelque chose d'un peu différent. Non valeurs, mais un formulaire entier, passé en paramètre. S'il vous plaît, ce n'est pas un formulaire MDI.Passage d'un formulaire enfant complet à un autre formulaire enfant

J'ai un formulaire parent avec 2 boutons. Un bouton crée une forme Child1 entre autres choses. Un autre bouton (facultatif) appelle un éditeur de formulaire enfant différent.

Le premier bouton est un bouton de validation qui, s'il est valide, affiche le formulaire Child1 avec une liste listbox remplie de paires clé/valeur. Le second est un éditeur avec ses propres boutons. Si l'un de ces boutons (submit) est enfoncé, le premier formulaire Child1 doit être mis à jour avec un nouveau keyvaluepair.

Le problème que j'ai eu est que je n'arrive pas à obtenir le formulaire Child1 pour refléter les changements. Je ne sais pas quelle est la meilleure façon de mettre à jour ce formulaire Child1. J'ai essayé BeginUpdate avec EndUpdate, et l'actualisation et maintenant avec tous les essais, je me suis un peu perdu. J'espère que quelqu'un peut m'aider. Ce que je veux réellement faire est actualiser ChildForm1, disons que c'est une boîte de réception, quand quelque chose est "sauvé" ou ajouté du deuxième rédacteur d'enfant. Avec le bouton cliquez dans ce second éditeur de childform, le premier Childform devrait être actualisé.

formulaire parent:

public ChildForm1 MyboxofValues; 

    private void btn1_Click(object sender, EventArgs e) 
    { 
      MyboxofValues = new ChildForm1(); 
      MyboxofValues.Show(); 
    } 

    private void btn2_Click(object sender, EventArgs e) 
    { 
     Editor myEditor = new Editor(); 
     myEditor.Show(); 
    } 

ChildForm1:

public ChildForm1() 
    { 
     InitializeComponent(); 
     updateMe(); 

    } 
    public void updateMe() 
    { 
     listView1.Items.Clear(); 
     if (MainCode.subRows.Count > 0) 
     { 
      foreach (KeyValuePair<string, string> element in MainCode.subRows) 
      { 
       ListViewItem lvi = new ListViewItem(element.Value); 
       lvi.SubItems.Add(element.Key); 
       listView1.Items.Add(lvi); 
      } 
     } 
    } 

EditorForm:

private ChildForm1 originalForm = new ChildForm1(); 

    private void btnSubmit_Click(object sender, EventArgs e) 
    { 
      originalForm.updateMe(); 
    } 

Je suis sûr qu'il est très facile, mais je ne peux pas l'obtenir. Si quelqu'un peut l'aider serait apprécié, économisez-moi des heures! S'il y a une meilleure façon de mettre à jour avec les résultats de soumission qui est aussi bien, s'il vous plaît montrer un exemple?

À des fins de test, j'ai créé un bouton «actualiser» pour le ChildForm1, qui fonctionne! (Il appelle juste le updateMe() en fait.Il est donc quelque chose wierd je pense comme que je crée une nouvelle instance du formulaire et en essayant de changer cette forme nonexisting (null) au lieu de l'actuelle ChildForm1. de la Form Editor.

Répondre

0

Je suggère de ne pas mettre à jour une forme d'une autre, mais plutôt que les données de travail stockées dans un objet comme un modèle de vue et toujours rafraîchir la forme de cela.

Jetez un oeil à la modèle MVP qui est utile pour les applications WinForms.

http://martinfowler.com/eaaDev/ModelViewPresenter.html

+0

Est-ce le bon lien? Je ne vois rien à propos de MVP – SuusvdVen

1

Plutôt que d'avoir Editor être une forme «enfant» du formulaire parent, en faire une forme enfant de ChildForm (alias un petit-enfant du parent). Bien sûr, puisque vous n'utilisez pas MDI, ce n'est qu'une manière logique d'aborder le problème, rien de plus.

Plutôt que d'avoir le parent de créer le Editor, faites-le créer . Lorsque le deuxième bouton du formulaire parent est cliqué, appelez une méthode comme CreateEditor de ChildForm. Quand il crée l'éditeur, il peut évidemment le stocker pour une interaction ultérieure.

Si le formulaire parent doit faire autre chose avec le Editor, il peut passer par le ChildForm pour le faire.

+0

Ok, bonne suggestion. (se sentir stupide de ne pas y penser) Mais maintenant la forme principale a juste le bouton de validation qui quand cliqué crée ChildForm1. ChildForm1 a maintenant le bouton pour créer l'éditeur. Encore un problème ... Je ne peux pas actualiser la listview depuis le formulaire de l'éditeur. Et je ne pense pas invoquer le bouton d'actualisation qui fonctionne, est le chemin? ;) – SuusvdVen

+0

@SuusvdVen Comme je l'ai dit dans ma réponse, la forme principale peut toujours avoir le bouton qui crée le 'Editor', il" passe simplement par le formulaire enfant ". Le formulaire principal appelle une méthode du formulaire enfant, le formulaire enfant crée l'éditeur. Pour ce qui est de la façon dont vous transmettez l'information de l'éditeur au parent, faites simplement la même chose que vous faites pour toujours communiquer entre un parent et un enfant, et faites-le deux fois. Demandez à l'éditeur de transmettre les informations à l'enfant et l'enfant transmet les informations au parent. Cela se ferait à travers deux événements. L'éditeur soulève un événement que le formulaire enfant utilise pour en générer un autre. – Servy

+0

Le formulaire principal (parent) n'a pas besoin de travailler avec l'éditeur, c'est pourquoi je l'ai mis dans le ChildForm1. J'ai toujours des problèmes pour obtenir la liste à partir de ChildForm1 à mettre à jour en fonction de l'éditeur. J'essaie actuellement de savoir si je devrais utiliser des délégués. Mais merci. – SuusvdVen

0

En grande partie grâce à l'aide perceptive de Servy. Je ne sais pas si cela pourrait aider quelqu'un d'autre alors voici ce qui a fonctionné pour moi .:

formulaire parent, MyBox, qui est selon la façon dont je pensais à l'origine, il était auparavant ChildForm1:

public MyBox() 
    { 
     InitializeComponent(); 
     updateMe(); 
    } 
    public void updateMe() 
    { 
     listView1.Items.Clear(); 
     if (MainCode.subRows.Count > 0) 
     { 
      foreach (KeyValuePair<string, string> element in MainCode.subRows) 
      { 
       ListViewItem lvi= new ListViewItem(element.Value); 
       lvi.SubItems.Add(element.Key); 
       listView1.Items.Add(lvi); 
      } 
     } 
    } 
    private void btnCreateEditor_Click(object sender, EventArgs e) 
    { 
     plainTextEditor editor = new plainTextEditor(this); 
     Form1.editorOpen = true; 
     editor.Show(this); 
    } 

Cette Formulaire a un bouton qui appelle le formulaire de l'éditeur qui ressemble à ceci maintenant:

public partial class Editor : Form 
{ 
    private MyBox listviewBoxForm; 

    public Editor(listviewBoxForm _form1) 
    { 
     InitializeComponent(); 
     inboxForm = _form1; 
    } 
} 

En fait, simple, mais ne l'a pas vu immédiatement. Je le rendais plus compliqué que nécessaire pour être avec les délégués, etc. C'est simple et ça semble marcher pour moi.

Questions connexes