如何从C#中的窗体返回值?

我有一个主窗体(我们称之为frmHireQuote),它是一个主MDI窗体(frmMainMDI)的子窗体,当单击一个button时,通过ShowDialog()显示另一个窗体(frmImportContact)。

当用户单击frmImportContact上的“OK”时,我想将几​​个stringvariables传回给frmHireQuote上的某些文本框。

请注意,可能有多个frmHireQuote实例,回到调用frmImportContact实例的实例显然是很重要的。

这样做的最好方法是什么?

像这样在你的子表单上创build一些公共属性

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

然后在你的子窗体中设置 OKbutton点击处理程序

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

然后在你的frmHireQuote表单中 ,当你打开子表单的时候

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

另外,如果你希望取消子表单,你可以在表单中添加一个button,并将其DialogResult设置为Cancel并且还可以将表单的CancelButton属性设置为该button – 这将使转义键取消出来的forms。

我通常在form / dialog上创build一个静态方法,我可以调用它。 这将返回成功(确定button)或失败,以及需要填写的值。

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

并在表格上:

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

打电话给你的表格;

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

发现这个代码的另一个小问题…或者至less当我试图实现它是有问题的。

frmMain中的button不会返回兼容的值,使用VS2010我添加了以下内容,一切正常工作正常。

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

添加两个button值之后,对话框效果很好! 感谢这个例子,它确实有帮助。

我只是通过引用将东西放入构造函数中,所以子窗体可以更改其值,而主窗体可以从子窗体中获取新的或修改的对象。

我使用MDI相当多,我比其他浮动forms更喜欢它(可以使用它)。

但为了从中获得最大的收益,您需要掌握自己的事件。 这让你的生活变得如此简单。

一个骨架的例子。

有你自己的interupttypes,

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

然后你自己的types

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

然后在你的命名空间中使用委托,但在类之外

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

现在无论是手动还是使用GUI,都要让MDIparent响应子窗体的事件。

但是用你的owr args,你可以把这个减less到一个单一的function。 你可以提供中断interupts,有利于debugging,但也可以在其他方面有用。

只要你的mdiparent事件代码指向一个函数,

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

一个简单的开关机制通常足以将事件传递给适当的表单。

如果你想从form1传递数据到form2而不像新form(sting "data");那样传递form(sting "data");

在表单1中这样做

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

在表格2中添加

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

如果你想在form1交换一些东西,你也可以像这样在form1使用值

只是在form1

 textbox.Text =form2.ReturnValue1