在C#中返回Windows窗体之间的结果

我有两个Windows窗体(MyApp,Generator),我需要从MyApp调用Generator

Form gen = new Generator(); gen.Show(); string result = gen.IDontKnowWhatToDoHere(); 

我的Generator.cs表单有三个TextBox和一个Button Ok,所以当用户在三个TextBox中键入一些文本时,单击Ok我想在这三个TextBox中输入Text。

你有什么想法我能做到这一点吗?

谢谢。

 class Generator : Form { public string Text1 { get; private set; } void ok_Click (object sender, EventArgs) { this.Text1 = txt1.Text; ... this.Close(); } } Form gen = new Generator(); gen.ShowDialog(); string text1 = gen.Text1; ... 

 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; 

我通常使用这种模式:

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

这使得它在单个语句中工作,类似于MessageBox,并且不需要公开任何控件。 您还可以将任何其他数据作为参数包含在静态方法中,并将它们传递给表单的构造函数或相应地设置属性。

另一个好处包括,如果需要,可以重用表单的实例。

如果您需要来自无模态表单的数据,则应使用事件或其他通知模式。

 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 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! } } 
 Form gen = new Generator(); gen.ShowDialog(); string result = gen.IDontKnowWhatToDoHere(); 

但我认为更有效的是创建代表。

IF Generator是一个表单,因此它inheritance自Form,将行更改为:

 Generator gen = new Generator(); gen.Show(); string result = gen.SomePublicVariableOrProperty; 

我想你可以尝试将Current Form实例作为参数传递给Generator表单的构造函数。

在单击事件后填写Textbox一旦在构造函数中传递的实例的帮助下将其分配给主窗体中的属性。

 Form gen = new Generator(this); gen.Show(); public Generator(Form F1) { InitializeComponent(); form1 = F1 as ParentForm; // now you have parent reference } 

按钮单击Generator表单

form1.Somproperty 分配值

希望这可以帮助