2011-12-19 3 views
1

Я знаю, что это очень простой вопрос, но я ищу аккуратное и чистое предложение. Мое приложение - приложение MDI. Создал базовую форму, которая используется во всем приложении. Есть несколько форм, которые мы не хотим, чтобы пользователь закрывался, чтобы избежать человеческих ошибок, которые мы планировали не позволять пользователю закрывать эти формы.Как ограничить пользователя закрытием Winform C#

Я попытался установить e.cancel = true в событии закрытия формы, но кажется, что он не работает, может кто-нибудь дать мне некоторые предложения, пожалуйста?

Edit:

Private void FrmTask_FormClosing(object sender, FormClosingEventArgs e) 
     {   
       e.Cancel = true; 
     } 

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

+0

Вы имеете в виду только предотвратить закрытие окна? Или даже остановить процесс? – Tudor

+1

Код smaple был бы полезен. e.Cancel = true; должен сделать трюк. –

+3

Пожалуйста, покажите нам код, где вы установили 'e.Cancel = true;' – Fischermaen

ответ

2

Вы также можете не показывать кнопку закрытия:

http://blogs.msdn.com/b/atosah/archive/2007/05/18/disable-close-x-button-in-winforms-using-c.aspx

Cody Серый обеспечил лучшую связь в комментариях, что также запрещает Alt-F4 Закрыть:

https://stackoverflow.com/a/4655948/366904

+1

Но пользователь может закрыть форму с помощью Alt + F4. – Fischermaen

+1

Да, это * неправильный способ отключения кнопки закрытия. Как упоминает Фишерман, пользователь все равно сможет закрыть окно с помощью клавиатуры.Вместо этого вы должны добавить стиль 'CS_NOCLOSE' в класс окна, как описано [здесь] (http://stackoverflow.com/a/4655948/366904). –

+0

@CodyGray Ницца найти! Я обновлю ответ, чтобы включить вашу ссылку. Если вы опубликуете его в качестве ответа, я подниму вас, надеюсь, предоставит вам принятый титул. –

2

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

Для этого вам потребуется ручное переопределение, скажем, переменная с именем allowShutdown и метод, который может установить это при закрытии MdiParent.

private void Form_Closing(object sender, EventArgs e) 
{ 
    if(!allowShutdown) e.Cancel = true; 
} 

public void ForceShutdown() 
{ 
    allowShutdown = true; 
    Close(); 
} 

И тогда в вашей родительской форме:

private void Form_Closing(object sender, EventArgs e) 
{ 
    if(childForm != null) childForm.ForceShutdown(); 
} 

Это предполагает, что вы поддерживаете ссылку на форму ребенка в вашей родительской форме при ее создании. Объедините это со способностью скрывать кнопку закрытия, указанную в другом сообщении, и у вас должно быть рабочее решение.

+0

Да, это, вероятно, сработает, но это довольно уродливое решение. Вы запрещаете пользователю закрывать форму, не указывая пользователю, что им не разрешено закрывать форму. Они будут сидеть там, нажав кнопку «X» напрасно, и ничего не произойдет. Нет абсолютно никакой подсказки, что им не разрешено закрывать окно. [Решение] (http://stackoverflow.com/a/4655948/366904) Я связан с выше, это гораздо лучший вариант. Это сводит к минимуму количество кода, который вы должны писать в каждой форме, а также делает очевидным для пользователя, что им не разрешено закрывать окно. –

+0

ха-ха-ха, там не будет отображения сообщений, которые не закрывают приборную панель, так как это получает данные в реальном времени, но чтобы избежать человеческих ошибок, мы реализуем это решение. – Shax

+0

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

0

Я подозреваю, что FormClosingEventArgs.CloseReason предоставит вам достаточно информации, чтобы определить, следует ли условно отменить Close.