Comment retourner une valeur d’un formulaire en C #?

J’ai un formulaire principal (appelons-le frmHireQuote) qui est un enfant d’un formulaire MDI principal (frmMainMDI), qui affiche un autre formulaire (frmImportContact) via ShowDialog () lorsqu’un bouton est cliqué.

Lorsque l’utilisateur clique sur “OK” sur frmImportContact, je souhaite renvoyer quelques variables de chaîne dans certaines zones de texte sur frmHireQuote.

Notez qu’il pourrait y avoir plusieurs instances de frmHireQuote, il est évidemment important que je revienne à l’instance qui a appelé cette instance de frmImportContact.

Quelle est la meilleure méthode pour faire cela?

Créez des propriétés publiques sur votre sous-formulaire comme ça

public ssortingng ReturnValue1 {get;set;} public ssortingng ReturnValue2 {get;set;} 

puis définissez ceci à l’intérieur de votre sous-formulaire

 private void btnOk_Click(object sender,EventArgs e) { this.ReturnValue1 = "Something"; this.ReturnValue2 = DateTime.Now.ToSsortingng(); //example this.DialogResult = DialogResult.OK; this.Close(); } 

Ensuite, dans votre formulaire frmHireQuote , lorsque vous ouvrez le sous-formulaire

 using (var form = new frmImportContact()) { var result = form.ShowDialog(); if (result == DialogResult.OK) { ssortingng val = form.ReturnValue1; //values preserved after close ssortingng dateSsortingng = form.ReturnValue2; //Do something here with these values //for example this.txtSomething.Text = val; } } 

De plus, si vous souhaitez annuler le sous-formulaire, vous pouvez simplement append un bouton au formulaire et définir son DialogResult sur Cancel et vous pouvez également définir la propriété CancelButton du formulaire sur ce bouton – cela activera la touche d’échappement pour annuler hors de la forme.

Je crée normalement une méthode statique sur formulaire / dialog, que je peux appeler. Cela renvoie le succès (bouton OK) ou l’échec, ainsi que les valeurs à remplir.

  public class ResultFromFrmMain { public DialogResult Result { get; set; } public ssortingng Field1 { get; set; } } 

Et sur le formulaire:

 public static ResultFromFrmMain Execute() { using (var f = new frmMain()) { var result = new ResultFromFrmMain(); result.Result = f.ShowDialog(); if (result.Result == DialogResult.OK) { // fill other values } return result; } } 

D’appeler votre formulaire;

 public void MyEventToCallForm() { var result = frmMain.Execute(); if (result.Result == DialogResult.OK) { myTextBox.Text = result.Field1; // or something like that } } 

J’ai trouvé un autre petit problème avec ce code … ou du moins c’était problématique quand j’ai essayé de l’implémenter.

Les boutons de frmMain ne renvoient pas de valeur compatible, en utilisant VS2010, j’ai ajouté ce qui suit et tout a bien fonctionné.

 public static ResultFromFrmMain Execute() { using (var f = new frmMain()) { f.buttonOK.DialogResult = DialogResult.OK; f.buttonCancel.DialogResult = DialogResult.Cancel; var result = new ResultFromFrmMain(); result.Result = f.ShowDialog(); if (result.Result == DialogResult.OK) { // fill other values } return result; } } 

Après avoir ajouté les deux valeurs de bouton, la boîte de dialog a très bien fonctionné! Merci pour l’exemple, ça a vraiment aidé.

Je viens de mettre dans le constructeur quelque chose par référence, afin que le sous-formulaire puisse changer sa valeur et que la forme principale puisse obtenir un object nouveau ou modifié à partir du sous-formulaire.

J’utilise beaucoup MDI, je l’aime beaucoup plus (où il peut être utilisé) que plusieurs formes flottantes.

Mais pour en tirer le meilleur parti, vous devez maîsortingser vos propres événements. Cela rend la vie beaucoup plus facile pour vous.

Un exemple de squelette.

Avoir vos propres types d’interruption,

 //Clock, Stock and Accoubts represent the actual forms in //the MDI application. When I have multiple copies of a form //I also give them an ID, at the time they are created, then //include that ID in the Args class. public enum InteruptSource { IS_CLOCK = 0, IS_STOCKS, IS_ACCOUNTS } //This particular event type is time based, //but you can add others to it, such as document //based. public enum EVInterupts { CI_NEWDAY = 0, CI_NEWMONTH, CI_NEWYEAR, CI_PAYDAY, CI_STOCKPAYOUT, CI_STOCKIN, DO_NEWEMAIL, DO_SAVETOARCHIVE } 

Ensuite, votre propre type Args

 public class ControlArgs { //MDI form source public InteruptSource source { get; set; } //Interrupt type public EVInterupts clockInt { get; set; } //in this case only a date is needed //but normally I include optional data (as if a C UNION type) //the form that responds to the event decides if //the data is for it. public DateTime date { get; set; } //CI_STOCKIN public StockClass inStock { get; set; } } 

Ensuite, utilisez le délégué dans votre espace de noms, mais en dehors d’une classe

 namespace MyApplication { public delegate void StoreHandler(object sender, ControlArgs e); public partial class Form1 : Form { //your main form } 

Maintenant, manuellement ou à l’aide de l’interface graphique, le MDIparent doit répondre aux événements des formulaires enfants.

Mais avec vos owr Args, vous pouvez réduire cela à une seule fonction. et vous pouvez prévoir d’interrompre les interruptions, ce qui est bon pour le débogage, mais peut également être utile à d’autres égards.

Il suffit que tous vos codes d’événement mdiparent indiquent la fonction unique,

  calendar.Friday += new StoreHandler(MyEvents); calendar.Saturday += new StoreHandler(MyEvents); calendar.Sunday += new StoreHandler(MyEvents); calendar.PayDay += new StoreHandler(MyEvents); calendar.NewYear += new StoreHandler(MyEvents); 

Un simple mécanisme de commutation suffit généralement à transmettre des événements aux formulaires appropriés.

Si vous souhaitez transmettre des données à form2 partir de form1 sans passer comme une nouvelle form(sting "data");

Faites comme ça dans la forme 1

 using (Form2 form2= new Form2()) { form2.ReturnValue1 = "lalala"; form2.ShowDialog(); } 

sous forme 2 append

 public ssortingng ReturnValue1 { get; set; } private void form2_Load(object sender, EventArgs e) { MessageBox.Show(ReturnValue1); } 

Aussi, vous pouvez utiliser la valeur dans form1 comme ceci si vous voulez échanger quelque chose sous la form1

juste en forme1

 textbox.Text =form2.ReturnValue1 

Vous devez d’abord définir l’atsortingbut dans form2 (enfant), vous mettrez à jour cet atsortingbut dans form2 et aussi à partir de form1 (parent):

  public ssortingng Response { get; set; } private void OkButton_Click(object sender, EventArgs e) { Response = "ok"; } private void CancelButton_Click(object sender, EventArgs e) { Response = "Cancel"; } 

Appel de form2 (enfant) à partir de form1 (parent):

  using (Form2 formObject= new Form2() ) { formObject.ShowDialog(); ssortingng result = formObject.Response; //to update response of form2 after saving in result formObject.Response=""; // do what ever with result... MessageBox.Show("Response from form2: "+result); }