12

编辑:这种方法实际上效果很好,我问了它,然后找到了解决方案。我在重载的 ShowDialog() 方法中添加了正确的调用(它不是完全重载,甚至不是覆盖,但它的工作原理相同。我的新问题是底部的问题。

我有一个表单,您可以在其中单击三个按钮之一。我为返回的结果定义了一个枚举。我想拨打电话:

MyFormResults res = MyForm.ShowDialog();

我可以使用以下代码添加一个新的 ShowDialog 方法:

public new MyFormResults ShowDialog()
{
    //Show modal dialog
    base.ShowDialog(); //This works and somehow I missed this

    return  myResult; //Form level variable (read on)
}

单击按钮时,我为结果设置了表单级变量:

MyFormResults myResult;

private void btn1_click(object sender, EventArgs e)
{
    myResult = MyFormsResults.Result1;
    this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
    this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}

//Same as above for the other results

我唯一缺少的是显示对话框(模式)然后返回我的结果的代码。没有base.ShowDialog()功能,那我该怎么做呢?

编辑:有一个'base.ShowDialog()'并且它有效。这是我的新问题:

另外,这是做这一切的最好方法吗?为什么?

谢谢。

4

4 回答 4

13

编辑:更改 的功能并不是一个好主意ShowDialog(),人们希望它返回 aDialogResult并显示表单,我建议如下我的建议。因此,仍然允许ShowDialog()以正常方式使用。

你可以在你的上创建一个静态方法MyForm,比如DoShowGetResult()

看起来像这样

public static MyResultsForm DoShowGetResult()
{
   var f = new MyForm();
   if(f.ShowDialog() == DialogResult.OK)
   {
      return f.Result;   // public property on your form of the result selected
   }
   return null;
}

那么你可以使用这个

MyFormsResult result = MyForm.DoShowGetResult();
于 2010-09-21T21:49:39.757 回答
5

试试这个,它似乎对我有用:

 public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public DialogResult ShowDialog(string mes)
        {
            this.textBox1.Text = mes;
            return base.ShowDialog();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
于 2012-10-22T08:59:24.217 回答
1

ShowDialog方法不能被覆盖。不过,您可以做的是创建一个新方法,该方法返回 ShowDialog 结果和另一个值。

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}
于 2010-09-21T21:49:40.983 回答
1

不,这是不可能的。通常的解决方法是将您的真实结果作为表单上的属性公开:

public MyFormResults MyResult
{
    get;
}

然后你会设置这个:

private void btn1_click(object sender, EventArgs e)
{
    MyResult = MyFormsResults.Result1;
    this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
    this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}

调用代码通常如下所示:

if (form.ShowDialog == DialogResult.OK)
{
    //do something with form.MyResult
}
于 2010-09-21T21:51:16.363 回答