Pergunta

Eu estou meio preso com um presente, então eu esperava que alguém poderia me ajudar.

Eu estou fazendo um aplicativo WinForms e eu preciso mostrar um diálogo modal (form.ShowDialog) que retorna um valor (solicita ao usuário alguns valores e os envolve em um Object).

Eu simplesmente não consigo ver como fazer isso em vez de dar uma referência para o objeto ou dependendo alguma forma de propriedade pública para ler os dados depois.

Eu só gostaria de ter ShowDialog retorno algo diferente, mas isso não funciona. É thare alguma forma "bom" para fazer isso?

Eu tenho certeza que o problema não é novo, mas uma vez que quase ninguém parece fazer Winforms mais não consigo encontrar qualquer orientação sobre a web.

Foi útil?

Solução

Adicionar um método estático ao seu formulário, como este:

public class MyDialog : Form
{
    // todo: think of a better method name :)
    public static MyObject ShowAndReturnObject() 
    {
        var dlg = new MyDialog();
        if (new dlg.ShowDialog() == DialogResult.OK) 
        {
            var obj = // construct an instance of MyObject from dlg
            return obj;
        }
        else
        {
           return null; 
        }
    }
}

Agora você pode chamar isso de seu programa assim:

var myObject = MyDialog.ShowAndReturnObject();

... e se eles cancelar o diálogo, myObject será nulo.

Agora, tendo dito tudo isso, eu acredito que a adição de uma propriedade à classe do formulário que você então ler a partir de depois de chamar ShowDialog () é a melhor abordagem.

Outras dicas

Você pode criar uma propriedade pública dentro do diálogo que representa o valor de retorno:

/* Caller Code */   
var dlg = new MyDialog();
if(dlg.ShowDialog() == DialogResult.OK)
  MessageBox.Show(dlg.MyResult);

/* Dialog Code */
public string MyResult { get { return textBox1.Text; } }

private void btnOk_Click(object sender, EventArgs e)
{
  DialogResult = System.Windows.Forms.DialogResult.OK;
  this.Close();
}

Ou você pode criar um novo método ShowDialog dentro de sua classe de formulário que faz basicamente o que Matt Hamilton faz. Talvez até mesmo um método de extensão Se é algo que você faz para muitas formas em seu problema.

A propriedade pública na forma de diálogo faz sentido. No entanto, não fechar o diálogo no manipulador de eventos clique no botão Ok. Quando você atribui a propriedade DialogResult a forma de diálogo serão ocultados. Em seguida, na forma de chamada pode determinar se OK ou Cancelar foi clicado examinando o DialogResult. Depois, você pode acessar a propriedade pública se o botão Ok foi clicado e, em seguida, descartar a forma de diálogo. Isto deve ser feito usando um bloco try-catch-finally na forma de chamar ou através de uma instrução using. Você deve descartar o diálogo modal, a fim de evitar uma fuga de memória.

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