2012-02-23 1 views
0

У меня есть две вложенные формы (form1 и form2), показанные модально, то есть из моего MainForm. Я показываю form1 modally by вызов (при событии нажатия кнопки) form1.ShowDialog() и из кода формы1 я затем вызываю (на другое событие нажатия кнопки) form2.ShowDialog().Настройка свойства DialogResult на вложенных формах показала, что модально скрывает распространение модальных диалогов в дереве форм

Установив свойство DialogResult формы2 (например, нажав кнопку закрытия X в строке заголовка формы), форма 2 скрыта (как и ожидалось), а также форму 1 скрыта (неожиданно). Основной поток выполняет код после строки form2.ShowDialog() и сразу же продолжает выполнение кода после строки form1.ShowDialog().

Я пробовал один и тот же вложенный шаблон с новым проектом, и выяснилось, что скрытие не распространяется на первую форму вызова. Следовательно, в моем коде должно быть что-то не так, но я не могу его найти. Кто-нибудь знает, что может вызвать это?


Если это может помочь, я также остановил оба проекта в режиме отладки сразу после нажатия кнопки закрытия формы2. Столбцы вызовов обоих проектов точно совпадают с вызовом программы. Main() on. Стеки вызовов различаются только до этого вызова. Я стараюсь, чтобы подчеркнуть различия:

Не рабочий проект

[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.AppDomain.nExecuteAssembly(System.Reflection.RuntimeAssembly assembly, string[] args) + 0x9 bytes 
mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e bytes 
mscorlib.dll!System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x90 bytes 
mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext, string[] activationCustomData) + 0x65 bytes 
mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext) + 0xd bytes 
mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext activationContext) + 0x44 bytes 
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 bytes 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x63 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes  
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x2c bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes 
[Native to Managed Transition] 

Рабочий проект

[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6d bytes  
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x2a bytes 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x63 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes  
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x2c bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes 
    [Native to Managed Transition] 

EDIT Вот вместо того, чтобы, как я открываю формы:

private void button1_Click(object sender, EventArgs e) 
{ 
    using (Form2 form2 = new Form2()) 
    { 
     form2.ShowDialog(); 
    } 
} 
+1

можете ли вы опубликовать свой код, показывающий, как вы открываете формы? – Taryn

+0

благодарит за публикацию кода для открытия формы2, но как насчет form1? у вас есть события закрытия формы и т. д.? – Taryn

+0

@bluefeet form1 отображается таким же образом в событии нажатия кнопки, принадлежащей моему MainForm. Нет, у меня нет закрытий или каких-либо других событий ни в form1, ни в form2 –

ответ

2

Я предположил бы, что контроль button1 на Form1 имеет свойство DialogResult установить нечто иное, чем DialogResult.None.

+0

хороший улов, я не думал об этом. – Taryn

+0

На самом деле свойство DialogResult не было установлено. Но после прочтения вашего сообщения я вручную установил свойство в «DialogResult.None», и теперь проблема решена! Это действительно странно, так как я искал все ссылки на DialogResult и их не было. Поэтому я все еще не понимаю, где проблема, но, по крайней мере, есть простой способ избежать этого. –

+0

Ваш ответ не на 100% правильный, но мне очень помогло найти решение. Что я должен делать, должен ли я принять это? –

0

Я могу только предположить, что ваш form1 имеет CancelButton или AcceptButton набор свойств для BUTTON1

+0

Они были установлены, но я уже удалил оба свойства и ничего не изменил –

Смежные вопросы