Модальное диалоговое окно Windows Forms, которое возвращает объект, а не DialogResult - PullRequest
5 голосов
/ 27 октября 2008

Я как бы застрял с этим, поэтому я надеялся, что кто-нибудь сможет мне помочь.

Я делаю приложение Winforms, и мне нужно показать модальное диалоговое окно (form.ShowDialog), которое возвращает значение (запрашивает у пользователя некоторые значения и упаковывает их в объект).

Я просто не вижу, как это сделать, вместо того, чтобы давать ссылку на объект или в зависимости от какой-либо формы публичного свойства, чтобы потом прочитать данные.

Я бы хотел, чтобы ShowDialog возвращал что-то другое, но это не работает. Это какой-то "хороший" способ сделать это?

Я уверен, что проблема не нова, но, так как почти никто больше не делает Winforms, я не могу найти никакого руководства в Интернете.

Ответы [ 4 ]

12 голосов
/ 27 октября 2008

Добавьте статический метод к вашей форме, например:

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; 
        }
    }
}

Теперь вы можете вызывать это из вашей программы следующим образом:

var myObject = MyDialog.ShowAndReturnObject();

... и если они отменят диалог, myObject будет нулевым.

Теперь, сказав все это, я считаю, что добавление свойства к классу вашей формы, из которого вы затем читаете после вызова ShowDialog (), - лучший подход.

2 голосов
/ 07 октября 2012

Вы можете создать открытое свойство в диалоге, которое представляет возвращаемое значение:

/* 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();
}
0 голосов
/ 24 июня 2013

Открытое свойство в диалоговой форме имеет смысл. Однако не закрывайте диалоговое окно в обработчике события нажатия кнопки «ОК». При назначении свойства DialogResult диалоговая форма будет скрыта. Затем в форме вызова можно определить, были ли нажаты кнопки «ОК» или «Отмена», изучив DialogResult. Затем вы можете получить доступ к общедоступному свойству, если была нажата кнопка «ОК», и затем удалить диалоговую форму. Это должно быть сделано с помощью блока try-catch-finally в форме вызова или с помощью оператора using. Вы должны избавиться от модального диалога, чтобы предотвратить утечку памяти.

0 голосов
/ 27 октября 2008

Или вы можете создать новый метод ShowDialog внутри вашего класса формы, который делает в основном то, что делает Мэтт Гамильтон. Может быть, даже метод расширения, если это то, что вы делаете для множества форм в вашей проблеме.

...