2016-06-02 4 views
0

У меня есть две формы окон Form1 и Form2 и библиотека классов C# CLProduct.Отключение доступа к форме при открытии новой формы из библиотеки классов C#

Теперь Form1 уже открыт и метод в CLProduct класса называется, который показывает Form2 и в этот момент я хотел бы, чтобы ограничить доступ к Form1 до Form2 закрыт.

У меня есть следующий код в моем методе в CLProduct, которые загружаются

var _frm2= new Form2(); 
_frm2.ShowDialog(); 

Я знаю, что ShowDialog загружает модальной, который по умолчанию ограничивает доступ к Form1, когда ShowDialog вызывается из Form1, но в моем случае ShowDialog является на самом деле вызывается из класса, который по понятным причинам, не ограничивающими Form1, поскольку она не вызывается из Form1

Form2 работает на рабочем потоке, который создан в Form1 следующим

   if (pPBackgroundWorker.IsBusy == false) 
       {     
        // Start the asynchronous operation. 
        pPBackgroundWorker.RunWorkerAsync(); 
       } 

Есть ли способ справиться с этим с Form1_Load()?

+1

Вы являетесь автором 'CLProduct'? Возможно, я ошибаюсь, но я думаю, что есть возможность передать «форму» в другую «форму», чтобы можно было подумать о других ее родителях и о желаемом поведении. Но вам нужно будет изменить способ создания формы Form2 в примере выше. // Посмотрите на 'ShowDialog (это)' где 'this' является ссылкой на ваш« текущий »пользовательский интерфейс. – KDecker

+1

Если вы не являетесь автором 'CLProduct', вам, возможно, придется сделать небольшой« трюк », так сказать. Создайте еще одну 'Form' в' Form1', которая ничего не делает, покажет ее с помощью ShowDialog, так что это блокирует 'Form1' в то же время покажет' Form2', как вы сейчас. Если вы можете определить, когда 'Form2' был закрыт, вы можете закрыть новую' Form', а затем снова разрешить пользователю доступ к Form1. – KDecker

+0

В общем, ShowDialog() не имеет проблем с поиском окна владельца для диалога, если вы не используете перегрузку ShowDialog (владельца). Хотя достаточно легко придумать один, Application.OpenForms [0] обычно хорош. Crystal Ball говорит, что код работает на рабочем потоке. Это довольно серьезная проблема, которую нужно исправить, побочные эффекты могут быть очень неприятными. Используйте окно Debug> Windows> Threads отладчика для проверки. –

ответ

0

Вы должны просто позвонить ShowDialog для From2 и передать Form1 в качестве аргумента и получить желаемое поведение. (_frm2.ShowDialog(_frm1))

Но, как отмечает ХансПасант в комментариях, если Form2 не находит соответствующего владельца, он скорее всего означает, что он работает на рабочем потоке, что может привести к некоторым довольно неприятным ошибкам/проблемам.

+0

Да, он работает на рабочем потоке. Так что, может быть, нехорошо следовать этой реализации. Есть ли лучшее решение? – DoIt

+0

Этот вопрос гораздо глубже, чем я мог бы ответить в комментарии. О том, как библиотека 'CLProduct' работает внутри. Не зная ничего о том, что он делает или как это работает в настоящее время, и на самом деле не имеет времени изучить его, означает, что я, вероятно, не могу с этим поделать. // О том, как WinForms работает interanlly для обработки и координации форм приложений. @HansPassant будет иметь гораздо более элегантный способ выразить это. – KDecker

+0

Спасибо за ваше время. У меня есть рабочий поток, который вызывается нажатием кнопки из формы1, и этот конкретный поток вызывает метод, который вызывает форму2 – DoIt