Как на C# сделать следующую вещь.Есть формочка. При ее закрытии надо вызвать MessageBox и в зависимости от того нажата ли кнопка ОК или Cancel соттветственно закрыть окно или оставить его как есть.
Здравствуйте, <Аноним>, Вы писали:
А>Как на C# сделать следующую вещь.Есть формочка. При ее закрытии надо вызвать MessageBox и в зависимости от того нажата ли кнопка ОК или Cancel соттветственно закрыть окно или оставить его как есть.
переопредели OnClosing формы
и там выводи MessageBox и анализируй его DialogResult
Вот у меня в одной форме это примерно так выглядит:
protected override void OnClosing(CancelEventArgs e)
{
if (!_issaved)
{
DialogResult res = MessageBox.Show("Запись не сохранена!\nСохранить ее в черновики?", "Сохранить изменения?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
switch (res)
{
case DialogResult.Yes: this.DialogResult = DialogResult.OK; break;
case DialogResult.No: this.DialogResult = DialogResult.Ignore; break;
case DialogResult.Cancel: e.Cancel = true; break;
}
}
}
Здравствуйте, Аноним, Вы писали:
А>Как на C# сделать следующую вещь.Есть формочка. При ее закрытии надо вызвать MessageBox и в зависимости от того нажата ли кнопка ОК или Cancel соттветственно закрыть окно или оставить его как есть.
Не пойму в чем проблема, там как и в win32 есть bool MessageBox(...), находящийся в простратнстве имен, если ниче не путаю System, там ты указываешь кучу флагов, а результат возращает, если Ок — true, false — др кнопки(я не помню, но в Win32 это ТОЧНО есть, если не влому — можешь с помощью System.Reflection загрузить system32.dll — это круто и весело, на codeproject-e есть пример).
Здравствуйте, Grog13, Вы писали:
G>Здравствуйте, <Аноним>, Вы писали:
А>>Как на C# сделать следующую вещь.Есть формочка. При ее закрытии надо вызвать MessageBox и в зависимости от того нажата ли кнопка ОК или Cancel соттветственно закрыть окно или оставить его как есть.
G>переопредели OnClosing формы
а не проще подписаться на событие Closing?
G>и там выводи MessageBox и анализируй его DialogResult G>Вот у меня в одной форме это примерно так выглядит: G>
G> protected override void OnClosing(CancelEventArgs e)
G> {
G> if (!_issaved)
G> {
G> DialogResult res = MessageBox.Show("Запись не сохранена!\nСохранить ее в черновики?", "Сохранить изменения?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
G> switch (res)
G> {
G> case DialogResult.Yes: this.DialogResult = DialogResult.OK; break;
G> case DialogResult.No: this.DialogResult = DialogResult.Ignore; break;
G> case DialogResult.Cancel: e.Cancel = true; break;
G> }
G> }
G> }
G>
Я бы сделал все то же самое в обработчике события Closing.
А если уж переопределять OnClosing, то надо бы вызывать
base.OnClosing(e);
Re: Событие OnClose()
От:
Аноним
Дата:
08.04.06 16:50
Оценка:
Господа! Вы сдурели! Давно бреда не читал такого!
Один — "переопредели"! Второй вообще ахинею какую-то несёт? Нда... Далеко России до Индии, как я посмотрю... Или водки много было вчера?
Дже-Даи, блин...
Вопрошающему:
Подпишись на событие FormClosing формы. В нем:
DialogResult r = MessageBox.Show("Close?", "Close", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (r == DialogResult.No)
{
e.Cancel = true;
}
ЗЫ: "переопределяторы", блин.
—
The speed of processors doubles every 18 months" -- Moore's law "The speed of software halves every 18 months" -- Gates' law .
Здравствуйте, BlackTigerAP, Вы писали:
BTA>Господа! Вы сдурели! Давно бреда не читал такого!
BTA>Один — "переопредели"! Второй вообще ахинею какую-то несёт? Нда... Далеко России до Индии, как я посмотрю... Или водки много было вчера? BTA>Дже-Даи, блин...
Объясни, плиз, принципиальну разницу где обрабатывать OnClosing: переопределя сам метод в классе формы или подписавшись не событие?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Событие OnClose()
От:
Аноним
Дата:
10.04.06 09:39
Оценка:
Огромной разницы нет, но рассуждать можно по разному, например: если нужно обработать момент начала закрытия формы в самой же форме, то подписываться на свое же событие может показаться не совсем логично (и если придираться — то рассточительно), логичнее просто переопределить соотвествующий метод, не забыв вызвать метод базового класса. Если не вызвать метод базового класса, то обработчики события Closing не вызовуться.
Вот что написано в MSDN:
"The OnClosing method also allows derived classes to handle the event without attaching a delegate. This is the preferred technique for handling the event in a derived class."
Да, тут есть над чем поспорить. Скажете что "моя же SupperForm является наследником от Form!". Да, это так. Тут разница в "что они имели ввиду". Под "derived class" они подразумевали не только унаследованный класс, но и класс, от которого никто впоследствии наследоваться уже не будет. Если же ты делаешь "улучшенный класс", от которого впоследствии будешь наследоваться направо и налево, то конечно же нужно переопределять "OnClosing".
ЗЫ: Не люблю документацию с разночтениями...
The speed of processors doubles every 18 months" -- Moore's law "The speed of software halves every 18 months" -- Gates' law .
Здравствуйте, BlackTigerAP, Вы писали:
BTA>Да, тут есть над чем поспорить. Скажете что "моя же SupperForm является наследником от Form!". Да, это так. Тут разница в "что они имели ввиду". Под "derived class" они подразумевали не только унаследованный класс, но и класс, от которого никто впоследствии наследоваться уже не будет. Если же ты делаешь "улучшенный класс", от которого впоследствии будешь наследоваться направо и налево, то конечно же нужно переопределять "OnClosing".
BTA>ЗЫ: Не люблю документацию с разночтениями...
Я имел ввиду что есть две формы: одна главная (Form1) и одна второстепенная (EditorForm — например текстовый редактор). Так вот если юзер не записал изменения в этом редакторе (EditorForm) и попытался закрыть эту форму, то для меня логичее переопределить метод OnClosing формы EditorForm в самой формре и там выводить диалог подтверждения.
В данном контексте — что же криминального в этом?