Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Закрытие диалога


Автор: PaZ1T1V 6.1.2010, 10:36
Доброго времени суток, у меня возникла такая проблема:
есть SDI WinForms приложение, есть главная форма MainForm, есть вторая форма, открывается как дочерняя, но, в нее передается ссылка на родительскую форму:

Код



        MainForm form;
        public LoginForm(MainForm form)
        {
            InitializeComponent();
            this.form = form;
        }



дочерняя форма открывается с главной, как диалог:

Код


         LoginForm frm = new LoginForm(this);
         frm.ShowDialog();        



при нажатии на закрытие дочерней формы - [X], обрабатывается Form_Closing в дочерней форме, какие то значения меняются на главной форме, но после обработки этих данных форма как бы закрывается и открывается снова, я пробовал обрабатывать DialogResult, ничего не изменилось, подскажите как быть, а вот, собственно и код:

private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(this.DialogResult == DialogResult.Cancel)               
            {
                e.Cancel = true;
                this.Hide();
            }
        }

Автор: jonie 6.1.2010, 12:49
Цитата

Код

private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(this.DialogResult == DialogResult.Cancel)               
            {
                e.Cancel = true;
                this.Hide();
            }
        }

а вас не напрягает, что дочерняя форма будет недоступна, в случае выполнения кода в IF, при этом родительская форма будет заблокирована в методе ShowDialog() ?

Автор: Экскалупатор 6.1.2010, 13:51
Код

 this.Hide();

зачем эта строка? ты ж вроде закрывать хотел, а не прятать?

Автор: PaZ1T1V 6.1.2010, 14:32
хорошо, да, не правильно пишу, сам понимаю, скажите как правильно это сделать...

Автор: Экскалупатор 6.1.2010, 15:10
Код

this.Close();


Добавлено через 2 минуты
если честно вообще вот это не понимаю:
Код

private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(this.DialogResult == DialogResult.Cancel)               
            {
                e.Cancel = true;
                this.Hide();
            }
        }



объясни что ты пытаешься тут сделать?

Добавлено через 3 минуты и 1 секунду
если ты пытаешься обработать DialogResult то его надо обрабатывать не в дочерней форме, а в форме которая этот диалог создала.

Добавлено через 3 минуты и 59 секунд
такое ощущение что у тебя в обоих формах жуткая каша. 

Автор: PaZ1T1V 6.1.2010, 17:50
на this.Close() вылетает исключение, помоему все как нормально: родительская форма
Код

  private void button1_Click(object sender, EventArgs e)
        {
            LoginForm form = new LoginForm(this);            
            form.ShowDialog();
        }  


Дочерняя фома
конструктор
Код

 MainForm form;
        public LoginForm(MainForm form)
        {
            InitializeComponent();
            this.form = form;
        }

обработчик закрытия (немного переделал)

Код

 private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)
        {
           this.form.labelText = "";
           this.form.checkState = CheckState.Unchecked;          
           this.Close() // исключение StackOverflowException     
                  
        }


видимо надо открывать просто Show  - в том же потоке...

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

Автор: Экскалупатор 6.1.2010, 20:31
PaZ1T1V, что то у тебя напутано тут сильно. я все время так делал и все нормально работало. не понимаю зачем тебе нужен обработчик события закрытия формы.

Автор: kobra 7.1.2010, 16:39
если правилно понимаю задачу, то подход не верный. логичнее делать так
Код

    static class Program
    {
        

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            LoginForm loginForm = new LoginForm();
            if (loginForm.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainForm());
            }
        }
    }

Автор: PaZ1T1V 7.1.2010, 18:54
to cobra  спасибо большое, я понял как сделать... 

ЗЫ по идее да, сначала надо залогиниться а потом работать smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)