Замена ShowDialog () на Show () - PullRequest
       43

Замена ShowDialog () на Show ()

0 голосов
/ 31 января 2019

У меня есть форма, которая отображается с помощью ShowDialog (), таким образом, это модальное окно.

private void OpenForm(object sender, ItemClickEventArgs e)
{
    MyForm testForm = new MyForm();
    ...
    testForm.Enabled = true;
    testForm.ShowDialog(this);
    var dialogOk = testForm.DialogOK;
    if(dialogOk)
    {
       //do some stuff 1
    }
}

На форме есть кнопка «ОК».Когда нажимается OK, DialogOk устанавливается в значение true.Внутри класса MyForm:

private void OkClick(object sender, EventArgs e)
{
   // do some stuff 2
   ... 
   DialogOK = true;
   Hide();
}

Мне нужно преобразовать это в немодальное окно.Похоже, решение состоит в том, чтобы использовать Show () вместо ShowDialog (), но когда я использую Show (), код не останавливается и ждет нажатия кнопки ОК, поэтому никогда не вызывается «сделать что-то 1».

Используя Show (), как я могу сохранить поведение, чтобы запуск "делать что-то 1" после нажатия кнопки ОК?

Обновление: вот что я пытаюсьсейчас:

public partial class MyForm: XtraForm
{
   public bool DialogOk;

   private void OkClick(object sender, EventArgs e)
   {
      // do some stuff 2
      ... 
      DialogOk = true;
      Close();
   }
}

Метод 1:

public partial class MyMainForm : XtraForm
{
   private MyForm testForm;

   private void OpenForm(object sender, ItemClickEventArgs e)
    {
        if(testForm == null)
        {
            testForm = new MyForm();
        }
        ...
        testForm.Enabled = true;
        testForm.FormClosed += (s, a) => {
            var dialogOk = testForm.DialogOk;
            if (dialogOk)
            {
                // do some stuff 1
            }
        };
        testForm.Show(this);
    }
}

Метод 2:

public partial class MyMainForm : XtraForm
{
       private MyForm testForm;

       private void OpenForm(object sender, ItemClickEventArgs e)
        {
            if(testForm == null)
            {
                testForm = new MyForm();
            }
            ...
            testForm.FormClosed += testForm_Closed;
            testForm.Show(this);
        }

        private void testForm_Closed(object sender, EventArgs args)
        {
            var testForm = (Form)sender;
            testForm.Closed -= testForm_Closed;

            if (testForm.DialogResult == DialogResult.OK)
            {
               // do some stuff 1
            }
        }
 }

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Это работает для меня, поэтому не уверен, почему это не для вас (почесывая голову) ... Эта форма имеет две кнопки: одна снова открывает ту же форму, а другая кнопка закрывает форму.Родительская форма добавляет событие к закрытому событию.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 test = new Form1();

        test.FormClosed += Test_FormClosed;

        test.Show();
    }

    private void Test_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("closed -- do something else here!");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Close();
    }
}
0 голосов
/ 31 января 2019

Самый простой способ - переместить код из OpenForm в обработчик событий OkClick.Однако, если это неподходящее место для размещения кода, поскольку вы можете использовать одну и ту же форму для разных задач, вы можете добавить обработчик для события FormClosed, которое вызывается после закрытия формы и запуска кода.Например:

private void OpenForm(object sender, ItemClickEventArgs e)
{
    MyForm testForm = new MyForm();
    ...
    testForm.Enabled = true;
    testForm.FormClosed += (s, a) => {
      var dialogOk = testForm.DialogOK;
      if(dialogOk)
      {
         //do some stuff 1
      }
    };
    testForm.Show(this);
}
0 голосов
/ 31 января 2019

Вы можете использовать асинхронный обработчик событий, связанный с TaskCompletionSource, который прослушивает и ожидает закрытие формы

private asyc void OpenForm(object sender, ItemClickEventArgs e) {
    var source = new TaskCompletionSource<DialogResult>();

    EventHandler handler = null;
    handler = (s, args) => { 
        var  form = (MyForm)s;
        form.FormClosed -= handler;
        source.SetResult(form.DialogResult);
    }

    var testForm = new MyForm();
    testForm.FormClosed += handler; //subscribe
    //...
    testForm.Enabled = true;
    testForm.Show();

    var dialogOk = await source.Task;
    if(dialogOk == DialogResult.Ok) {
       //do some stuff 1
    }
}

С этим вы можетесохраните логику в OpenForm и дайте коду ждать без блокировки.

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

public partial class MyForm: XtraForm {

    //...

    private void OkClick(object sender, EventArgs e) {
        // do some stuff 2
        // ... 

        DialogResult = DialogResult.Ok;
        Cose();
    }
}
0 голосов
/ 31 января 2019

Вы можете обработать Form.Closed событие:

MyForm testForm = new MyForm();
testForm.Closed += testForm_Closed;
testForm.Show();

private void testForm_Closed(object sender, EventArgs args)
{
    var testForm = (Form)sender;
    testForm.Closed -= testForm_Closed;

    if (testForm.DialogResult == OK)
        // do some stuff 1
}
...