如何从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