加载mdi winform c#.net时的奇怪行为
我在c#MDI WinForms应用程序中遇到了一个奇怪的行为。当我与任何其他表单一起打开特定表单时,此特定表单会锁定。不知何故,它将两种形式的控制框组合为一个,如下所示: 由于窗体已停止响应,因此无法关闭并已停止绘制: 奇怪的是,任何其他形式的组合都很好。两个表单相互叠加加载,应用程序不会冻结。 但我不知道这种形式与其他形式有什么不同。所有设置都相同。 这是主MDIform中启动新子窗体的代码,通过ToolStrip按钮调用。单击事件:加载mdi winform c#.net时的奇怪行为,c#,.net,winforms,C#,.net,Winforms,我在c#MDI WinForms应用程序中遇到了一个奇怪的行为。当我与任何其他表单一起打开特定表单时,此特定表单会锁定。不知何故,它将两种形式的控制框组合为一个,如下所示: 由于窗体已停止响应,因此无法关闭并已停止绘制: 奇怪的是,任何其他形式的组合都很好。两个表单相互叠加加载,应用程序不会冻结。 但我不知道这种形式与其他形式有什么不同。所有设置都相同。 这是主MDIform中启动新子窗体的代码,通过ToolStrip按钮调用。单击事件: private void OpenForm(
private void OpenForm(object sender)
{
if (sender == null) return;
ToolStripMenuItem itemSender = (ToolStripMenuItem)sender;
try
{
WinForm mapping = (WinForm)itemSender.Tag;
if (!FormList.ContainsKey(mapping.FormName))
{
Type frmType = Type.GetType(string.Format("OrderAssist.Forms.{0}", mapping.FormName));
if (frmType != null)
{
Form newForm = (Form)Activator.CreateInstance(frmType);
if (!newForm.IsDisposed)
{
newForm.Name = mapping.FormName;
newForm.Tag = itemSender;
newForm.MdiParent = this;
newForm.Show();
newForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
newForm.FormClosing += new FormClosingEventHandler(newForm_FormClosing);
FormList.Add(newForm.Name, newForm);
itemSender.Checked = true;
newForm.Activate();
}
}
else
itemSender.Enabled = false;
}
else
FormList[mapping.FormName].Activate();
}
catch (Exception e)
{
Exceptions.ProgramException(e, Settings.User.ID, "Exception occured while opening a form.");
if (itemSender != null)
itemSender.Enabled = false;
}
}
更奇怪的是,如果我在打开另一个表单之前填充这个锁定了数据的表单并单击其中的一些控件,则不会发生错误
我不知道下一步该做什么
newForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
上面的一行是为所有控件调用的,这导致控件框被分组在一起
对于冻结的表单,您需要发布导致表单冻结的子表单的代码。然后我可以进一步帮助您。这不是您的问题的解决方案,但您的图片让我想起了这一点::DI看不到任何东西,但我会查找MDI代码中任何地方的递归。看起来您多次打开同一个表单,这就是“锁定”应用程序的原因。从您描述的情况来看,可能是一些被多次调用的事件处理。这是MDI的Winforms适配器代码中的一个错误。在MDI主窗体构造函数中创建子窗口时会发生这种情况。改为使用加载事件(OnLoad)。死画可能是另外一回事。我仔细检查了一下,只有两个表格是打开的,其中一个图片是其中一个挂着的表格的外观(停止绘画)。此外,OpenForm()是从ButtonClick事件调用的,与构造函数无关。挂起/崩溃的表单确实在构造函数中加载了另一个FormDialog,但我已经注释掉了该代码,表单仍然挂起。如果暂停调试器,它将停止在:Application.Run(new FormMain());,这表明不是我的代码锁定了我的表单(就像一个坏循环)?这部分有帮助;如果我使窗体WindowsState远离最大化,它将不会挂起。但是,即使我没有创建它最大化,用户所需要的只是在另一个窗体打开时按下最大化按钮,然后它突然挂起。