Pergunta

(VS2005, .NET 2.0)

Eu tenho um formulário exibido como uma caixa de diálogo usando o método showDialog (). A propriedade Cancelbutton do formulário está definida como um botão no formulário. Mesmo se eu definir o dialogresivo desse botão para nenhum, clicar no botão ainda fecha a caixa de diálogo. Não quero que isso aconteça - quero poder controlar se a caixa de diálogo fecha ou não.

Esse problema não ocorre com o Button do Formulário - com o DialogResultado desse botão definido como nenhum, posso fazer o que é necessário o processamento e depois decidir se deve ou não definir manualmente o dialograsult do formulário para fazer com que ele feche.

Eu pensei que a propriedade Cancelbutton se entendeu Soley para indicar o botão que deve ser "clicado" se a escape for pressionada (assim como o Button aceita apenas indicar o botão para "clicar" quando a entrada é pressionada). Estou errado nisso? Eu perdi algum outro motivo pelo qual meu formulário está fechando? Ou isso é um bug?

Editar: Código adicionado. Este é o formulário de diálogo (formulário 2) com o botão Cancelar (botão 1). O botão Cancelar é apenas o cancelamento do formulário, ele não possui dialogresult definido para cancelar, mas pressionar o botão ainda fecha o formulário

    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 );
    }
Foi útil?

Solução

Também tenha cuidado para que o formulário possa ser fechado pressionando o Alt+F4 e pressionando o botão X e os dois lados não acionarão o botão Cancelar o evento de clique em.

A menos que você também esteja lidando com essas situações, não seria melhor seguir os conselhos de Slurdge e impedir que o formulário se fechasse no evento de formulário.

Editar:Observe também que, se você alterar o dialograsult do botão de volta para nenhum no Windows Properties, estará alterando -o para o valor padrão. Se o valor for o valor padrão da propriedade, ele não será persistido no *.designer.cs. Mesmo que fossem persistidos, o código de inicialização da forma é colocado no último no *.Designer.cs e substituiria o Nenhum por Cancelar por causa da linha:

this.CancelButton = this.button1;

Como você pode verificar no refletor, a linha anterior faz isso:

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

Você pode alterá -lo de volta para nenhum no construtor após a chamada inicializecomponent ().

Outras dicas

Parece que você deseja executar a validação do fechamento de formulários.
O evento FormClosing é um ajuste perfeito para isso. Isso permitiria que você tivesse o mesmo código para controlar ou não.
Basta definir a propriedade Cancelar como True para evitar o fechamento. Ver FormClosing.

É o comportamento padrão.

De msdn:

Essa propriedade permite que você designar uma ação padrão para ocorrer quando o usuário pressiona a tecla ESC em seu aplicativo. Você pode usar essa propriedade para permitir que o usuário navegue rapidamente em um formulário simples, permitindo que eles simplesmente pressionem a tecla ESC para fechar uma janela sem cometer alterações em vez de clicar manualmente no botão Cancelar com o mouse.

Propriedade do CancelButton

Em vez de tentar lidar com isso no evento Button_Click, manipule -o no evento 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
   }
}

Eu lido com o meu código de botão Aceitar aqui também, presumo que qualquer coisa! = DIATRESULT.OK é um cancelamento, mas você pode fazer o que for confortável para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top