Windows Forms diálogo modal que retorna um objeto em vez de DialogResult
-
04-07-2019 - |
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.
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.