Como retornar um valor de um formulário em c #?

Eu tenho um formulário principal (vamos chamá-lo frmHireQuote) que é um filho de um formulário MDI principal (frmMainMDI), que mostra outro formulário (frmImportContact) via ShowDialog () quando um botão é clicado.

Quando o usuário clica em ‘OK’ no frmImportContact, eu quero passar algumas variables ​​de string de volta para algumas checkboxs de texto no frmHireQuote.

Observe que pode haver várias instâncias de frmHireQuote, é obviamente importante que eu volte para a instância que chamou essa instância de frmImportContact.

Qual o melhor método para fazer isso?

Crie algumas propriedades públicas em sua subforma como assim

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

em seguida, defina isso dentro do seu subformulário ok manipulador de clique do botão

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

Em seguida, no formulário frmHireQuote , quando você abrir o subformulário

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

Além disso, se você quiser cancelar o subformulário, basta adicionar um botão ao formulário e definir seu DialogResult como Cancel . Além disso, você também pode definir a propriedade CancelButton do formulário para esse botão. Isso permitirá que a chave de escape seja cancelada. fora do formulário.

Eu normalmente crio um método estático no formulário / diálogo, que eu posso chamar. Isso retorna o sucesso (botão OK) ou falha, juntamente com os valores que precisam ser preenchidos.

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

E no formulário:

 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; } } 

Para chamar seu formulário;

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

Encontrei outro pequeno problema com este código … ou pelo menos foi problemático quando tentei implementá-lo.

Os botões em frmMain não retornam um valor compatível, usando o VS2010 eu adicionei o seguinte e tudo começou a funcionar bem.

 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; } } 

Depois de adicionar os dois valores de botão, a checkbox de diálogo funcionou muito bem! Obrigado pelo exemplo, realmente ajudou.

Eu apenas coloco no construtor algo por referência, para que o subformulário possa alterar seu valor e o formulário principal possa obter objects novos ou modificados do subformulário.

Eu uso muito o MDI, eu gosto muito mais (onde ele pode ser usado) do que vários formulários flutuantes.

Mas, para obter o melhor disso, você precisa se familiarizar com seus próprios events. Isso torna a vida muito mais fácil para você.

Um exemplo esquelético.

Tenha seus próprios tipos de interrupções,

 //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 } 

Então o seu próprio tipo de 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; } } 

Em seguida, use o delegado em seu namespace, mas fora de uma class

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

Agora, manualmente ou usando a GUI, o MDIparent responde aos events dos formulários filhos.

Mas com o seu Args, você pode reduzir isso para uma única function. e você pode ter disposição para interromper as interupções, bom para debugging, mas pode ser útil de outras maneiras também.

Basta ter um dos seus códigos de evento mdiparent apontando para a function

  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); 

Um mecanismo simples de comutação geralmente é suficiente para passar os events para os formulários apropriados.

Se você quiser passar dados para o form2 do form1 sem passar como novo form(sting "data");

Faça assim no formulário 1

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

no formulário 2 adicionar

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

Além disso, você pode usar o valor em form1 como este, se você quiser trocar alguma coisa no form1

apenas no form1

 textbox.Text =form2.ReturnValue1 

Primeiro você tem que definir o atributo em form2 (child), você atualizará este atributo em form2 e também em form1 (parent):

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

Chamada de form2 (filho) de form1 (pai):

  using (Form2 formObject= new Form2() ) { formObject.ShowDialog(); string 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); }