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();
6 Réponses :
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;
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.
Form gen = new Generator(); gen.ShowDialog(); string result = gen.IDontKnowWhatToDoHere(); But i think is more effectives been create delegate.
Si le générateur est un formulaire, il hérite de la forme, changez la ligne à:
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)
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 code> formulaire code>.
une fois que vous avez rempli dans la zone code> 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. p> bouton Cliquez sur le générateur espère que cela aide P> P> > formulaire p> form1.somperty code> Attribuer les valeurs em> p>
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
}
}
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!
}
}
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.
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.