Модальное диалоговое окно Windows Forms, которое возвращает объект, а не DialogResult

StackOverflow https://stackoverflow.com/questions/239435

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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 (), является лучшим подходом.

Другие советы

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

/* 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();
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top