Установка свойства DialogResult для вложенных форм, показанных модально, приводит к тому, что скрытие модальных диалогов распространяется обратно в дерево форм. - PullRequest
0 голосов
/ 23 февраля 2012

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

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

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


Если это может помочь, я также остановил оба проекта в режиме отладки сразу после нажатия кнопки закрытия формы2.Стеки вызовов обоих проектов в точности совпадают с вызовом Program.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]

РЕДАКТИРОВАТЬ Вот вместо этого, как я открываю формы:

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

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

0 голосов
/ 23 февраля 2012

Я могу только предположить, что ваша форма1 имеет свойство CancelButton или AcceptButton, установленное в button1

...