代码之家  ›  专栏  ›  技术社区  ›  Rawling isekaijin

取消按钮关闭对话框?

  •  4
  • Rawling isekaijin  · 技术社区  · 16 年前

    (VS2005,.NET 2.0)

    我有一个使用showDialog()方法显示为对话框的表单。表单的CancelButton属性设置为表单上的按钮。即使我将该按钮的DialogResult设置为“无”,单击该按钮仍会关闭对话框。我不希望发生这种情况-我希望能够控制对话框是否关闭。

    此问题不会在窗体的AcceptButton中发生-当该按钮的DialogResult设置为“无”时,我可以执行必要的处理,然后决定是否手动设置窗体的DialogResult以使其关闭。

    我认为cancelButton属性的意思是,如果按下escape,则只应指示应“单击”的按钮(正如acceptButton只应指示按下Enter时要“单击”的按钮一样)。我错了吗?我错过了我的表格关闭的其他原因吗?或者这是个虫子?

    编辑:添加代码。这是带有“取消”按钮(按钮1)的对话框窗体(窗体2)。 “取消”按钮只是表单的“取消”按钮,它没有将DialogResult设置为“取消”,但按该按钮仍会关闭表单。

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Name = "button1";
            this.button1.Text = "button1";
            // 
            // Form2
            // 
            this.CancelButton = this.button1;
            this.Controls.Add( this.button1 );
            this.Name = "Form2";
            this.Text = "Form2";
            this.ResumeLayout( false );
        }
    
    4 回复  |  直到 13 年前
        1
  •  7
  •   João Angelo    16 年前

    另外,请注意,按Alt+F4并按X按钮可能会关闭窗体,并且这两种方式都不会触发取消按钮单击事件。

    除非您也在处理这些情况,否则最好遵循slurdge的建议并防止表单在FormClosing事件中关闭。

    编辑: 还要注意,如果在“属性”窗口中将按钮的对话框结果更改回“无”,则会将其更改为默认值。如果该值是属性的默认值,则不会将其保留在*.designer.cs中。即使表单被持久化,也会将表单初始化代码放在*.designer.cs的最后一个位置,并且会由于以下行而用cancel覆盖none:

    this.CancelButton = this.button1;
    

    正如您可以检入Reflector一样,前一行执行以下操作:

    public void set_CancelButton(IButtonControl value)
    {
        base.Properties.SetObject(PropCancelButton, value);
        if ((value != null) && (value.DialogResult == DialogResult.None))
        {
            value.DialogResult = DialogResult.Cancel;
        }
    }
    

    在初始化组件()调用后,可以在构造函数中将其更改回“无”。

        2
  •  5
  •   slurdge    16 年前

    似乎您要执行表单关闭的验证。
    FormClosing事件非常适合这种情况。这将使您能够使用相同的代码来控制关闭与否。
    只需将Cancel属性设置为true以防止关闭。 见 FormClosing .

        3
  •  2
  •   Anuraj    16 年前

    这是默认行为。

    来自MSDN:

    此属性允许您指定当用户在应用程序中按Esc键时发生的默认操作。您可以使用此属性允许用户快速浏览简单表单,方法是只需按Esc键关闭窗口而不提交更改,而不是用鼠标手动单击“取消”按钮。

    CancelButton Property

        4
  •  1
  •   jac    15 年前

    不要试图在按钮单击事件中处理这个问题,而要以关闭事件的形式处理它。

    MyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
       if (DialogResult == DialogResult.Cancel)
       {
          // do my processing ...
          if (false)
             e.Cancel = true;   // stop the form from closing
       }
    }
    

    我在这里也处理我的接受按钮代码,我假设一切!=dialogresult.ok是一个取消,但您可以做任何适合您的事情。