【问题标题】:Is it possible to overload the ShowDialog method for forms and return a different result?是否可以重载表单的 ShowDialog 方法并返回不同的结果?
【发布时间】:2011-04-15 10:49:21
【问题描述】:

编辑:这种方法实际上效果很好,我问了它,然后找到了解决方案。我在重载的 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()”,它可以工作。这是我的新问题:

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

谢谢。

【问题讨论】:

  • 好的,很尴尬,但是有一个“base.ShowDialog()”,它工作正常。我正在尝试“this.base.ShowDialog()”。这非常有效。

标签: c# modal-dialog overloading dialogresult


【解决方案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
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      编辑:更改ShowDialog() 的功能并不是一个好主意,人们希望它返回DialogResult 并显示表单,我建议如下我的建议。因此,仍然允许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();
      

      【讨论】:

        【解决方案4】:

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

        public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
          var dialogRet = ShowDialog();
          result = MyFormResults.Result1;
          return dialogRet;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-06
          • 1970-01-01
          • 2020-03-27
          • 1970-01-01
          • 1970-01-01
          • 2017-03-13
          • 1970-01-01
          • 2013-10-26
          相关资源
          最近更新 更多