(VS2005,.NET 2.0)

我有被显示为使用的ShowDialog()方法的对话框的形式。窗体的CancelButton属性设置为窗体上的按钮。即使我该按钮的的DialogResult设置为无,点击按钮仍然关闭对话框。我不希望这种事情发生 - 我希望能够控制对话框是否关闭与否

此问题不会与形式的的AcceptButton发生 - 与该按钮的的DialogResult设置为none,我可以做什么样的处理是必要的,然后再决定是否要手动设置窗体的DialogResult的以使其关闭

我以为CancelButton属性本来是索利表明,应该是“点击”按钮,如果按下Escape(多为的AcceptButton情况应该只是一个指示按钮“点击”被按下时输入)。我错在这?我错过了一些其他的原因,我的形式结束?或者,这是一个错误?

编辑:代码添加。这是对话形式(形式2)取消按钮(按钮1)。 取消按钮仅是窗体的CancelButton,它不具有的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 );
    }
有帮助吗?

解决方案

另外注意的是,形式可以是封闭的按下Alt + F4并按下X按钮和两种方式都不会触发取消按钮点击事件。

除非你也处理这些情况不会是最好遵循slurdge的意见和防止形式从事件的FormClosing关闭。

修改 另外请注意,如果你改变了按钮的DialogResult回无在属性窗口,你将其改为默认值。如果该值的属性,那么它不会在*了.Designer.cs是持久的默认值。即使它是持续的形式初始化代码被置于最后在*了.Designer.cs和将覆盖无与由于线路的取消:

this.CancelButton = this.button1;

可以在反射器检查前一行执行此:

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

可以在InitializeComponent()调用之后的构造改回为无。

其他提示

看来你要执行表单关闭验证。结果 该事件的FormClosing是这一个完美的结合。这将使你有相同的代码来控制关闭或没有。结果 只需设置取消属性为true来防止关闭。 请参阅的FormClosing

有默认行为。

从MSDN:

此属性允许您指定当用户按下应用程序中的ESC键进行默认操作。您可以使用此属性,允许用户通过允许他们只需按ESC键关闭窗口而不提交更改,而不是手动点击用鼠标取消按钮快速浏览一个简单的形式。

CancelButton属性

而不是试图在button_click事件来处理这种情况,在form_closing事件处理它。

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被取消,但你可以做什么是舒适的适合你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top