如何从C#中的Form返回一个值?

Jez*_*ark 175 .net c# parameter-passing winforms

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

当用户在frmImportContact上单击"确定"时,我想将一些字符串变量传递回frmHireQuote上的某些文本框.

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

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

Ric*_*end 342

像这样在子表单上创建一些公共属性

public string ReturnValue1 {get;set;} 
public string ReturnValue2 {get;set;}
Run Code Online (Sandbox Code Playgroud)

然后在你的子表单中设置 ok按钮单击处理程序

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

然后在你的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另外如果您希望取消子表单,只需在表单中添加一个按钮并将其DialogResult设置为Cancel,您也可以将表单的CancelButton属性设置为所述按钮 - 这将使退出键能够取消形式.

  • 一些重要的缺陷.不显示使用ShowDialog()显示的表单.您必须在此处使用*using*语句.ShowDialog()返回一个DialogResult值,不要忽略它,或者在用户取消对话框时尝试使用对话框属性. (31认同)

GvS*_*GvS 14

我通常在表单/对话框上创建一个静态方法,我可以调用它.这将返回成功(确定按钮)或失败,以及需要填写的值.

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


 }
Run Code Online (Sandbox Code Playgroud)

并在表格上:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

打电话给你的表格;

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


小智 6

发现这个代码的另一个小问题...或者至少当我试图实现它时它是有问题的.

frmMain中的按钮没有返回兼容值,使用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;
     }
}
Run Code Online (Sandbox Code Playgroud)

添加两个按钮值后,对话框工作得很好!谢谢你的例子,它确实有帮助.