9
votes

Résultat de retour entre les formulaires Windows en C #

J'ai deux formulaires Windows (MyApp, Generator), et j'ai besoin d'appeler Generator à partir de MyApp

Form gen = new Generator();
gen.Show();
string result = gen.IDontKnowWhatToDoHere();


4 commentaires

Le bouton OK fermera-t-il la forme ou non?


Je pense que oui ça va faire: cela.commose (), mais je ne peux pas appeler l'événement OnClose?


Avez-vous besoin de dialogue modal? C'est moyen que le code d'appel attendra jusqu'à ce que le formulaire soit fermé fermé.


Je m'en fiche, j'ai besoin d'une solution pour mon problème en utilisant modal ou sans.


6 Réponses :


7
votes
class TextInfo
{
    public string Text1 { get; set; }
    ...
}

class Generator : Form
{
    public TextInfo Textinfo { get; private set; }

    public Generator(TextInfo info)
    {
        this.TextInfo = info;
    }

    void ok_Click (object sender, EventArgs)
    {
        this.TextInfo.Text1 = txt1.Text;
        ...
        this.Close();
    }
}

TextInfo info = new TextInfo();
Form gen = new Generator(info);
gen.ShowDialog();
string text1 = info.Text1;

3 commentaires

Je l'ai fait mais text1 = "" Parce que le formulaire MyApp n'attend pas le formulaire de générateur pour envoyer des données, le texte1 est vide.


Comment rendre le MyApp attendre le formulaire de générateur à fermer avant de continuer l'exécution?


Vous devriez utiliser Form.Showdialog au lieu de.



1
votes
Form gen = new Generator();
gen.ShowDialog();
string result = gen.IDontKnowWhatToDoHere();
But i think is more effectives been create delegate.

0 commentaires

0
votes

Si le générateur est un formulaire, il hérite de la forme, changez la ligne à: xxx


2 commentaires

Résultat de la chaîne = Gen.SomePublicVariableOproperty; Cela devrait être appelé sur l'événement de l'oncle du générateur


Vous avez besoin de showdialog et de ne pas montrer. Ou utiliser l'événement OnClose (que dit Gabrield)



0
votes

Je pense que vous pouvez essayer en passant l'instance de formulaire actuelle sous forme de paramètre sur le constructeur du générateur formulaire .

une fois que vous avez rempli dans la zone sur clic de l'événement, attribuez-le à la propriété sous la forme principale à l'aide de l'instance qui a été transmise dans le constructeur. xxx

bouton Cliquez sur le générateur > formulaire

form1.somperty Attribuer les valeurs

espère que cela aide


0 commentaires

9
votes

J'utilise généralement ce motif:

TResult result = Generator.AskResult();

class Generator : Form
{
    // set this result appropriately
    private TResult Result { get; set; }
    public static TResult AskResult()
    {
        var form = new Generator();
        form.ShowDialog();
        return form.Result; // or fetch a control's value directly
    }
}


0 commentaires

2
votes

Si vous avez besoin de données d'une forme non modale, vous devez utiliser des événements ou une autre motif de notification.

class OkPressedEventArgs : EventArgs
{
   public OkPressedEventArgs(string text1, string text2, string text3)
   {
      Text1 = text1;
      Text2 = text2;
      Text3 = text3;
   }

   public string Text1 {get;private set;}
   public string Text2 {get;private set;}
   public string Text3 {get;private set;}
}

class SourceForm : Form
{
   public event EventHandler<OkPressedEventArgs> OkPressed;
   private void OnOkPressed()
   {
      if(OkPressed != null)
      {
          OkPressed(this, new OkPressedEventArgs(textBox1.Text, textBox2.Text, textBox2.Text);
      } 
   }

   private void okButton_Click(object source, EventArgs e)
   {
       OnOkPressed();
   }
}

class TargetClass
{
   void ShowFormMethod()
   {
      var form = new SourceForm();
      form.OkPressed += OkPressedHandler;
      form.Show();
   }

   private void OkPressedHandler(object source, OkPressedEventArgs e)
   {
      // process form data here!
   }
}


1 commentaires

Cela devrait être la réponse car il clarifie explicitement quoi faire avec des formes non modales, ce que vous utilisez formulés.Show () pour, comme l'a fait l'OP.