[英]How do I dynamically add controls into windows form splitter control while window is minimized?
我正在寻找在我们工作室编写的一个小型.NET应用程序中的错误。 该对话框基本上是状态报告对话框,它会根据当前正在记录的操作数,尝试向现有对话框动态添加1(或更多)进度条。
我们有一个对话框,其中包含一个包含拆分器容器的主对话框。 拆分器的下部与一个丰富的edito控件绑定,该控件显示状态喷出。 拆分器区域的顶部是我们要动态添加1(或更多)进度条的位置。
在操作过程中,将创建新的进度条,然后通过调整拆分容器面板1的大小来适应新控件,然后将其附加到拆分容器,然后将新控件添加到拆分容器中(代码如下所示)。 如果未将窗口最小化,则此代码非常有用。 当窗口最小化时,运行时将引发异常,指示无法调整拆分容器的大小。 具体来说,这是错误消息:
An exception of type 'System.InvalidOperationException' has occurred.
Message: SplitterDistance must be between Panel1MinSize and Width - Panel2MinSize.
问题(我认为)是因为将窗口最小化,所以窗口的高度太小,无法调整拆分容器的大小。 我怀疑.NET正在查看窗口的最小大小,而不是正常状态的大小。
这是代码(请注意引发异常的行):
// if we don't have any operations yet, add a small top margin
if (splMain.SplitterDistance == 0) {
splMain.SplitterDistance = 3; // THE EXCEPTION IS THROWN HERE!!!!
}
ProgressDisplay display = new ProgressDisplay();
display.OperationFinished += OperationFinished;
display.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
display.LabelText = label;
display.Location = new Point(6, splMain.SplitterDistance);
display.Size = new Size(splMain.Panel1.Width-12, display.Height);
display.Start(steps);
m_Operations.Push(display);
// add the display to the top panel
splMain.IsSplitterFixed = false;
splMain.SplitterDistance += display.Height + 3;
splMain.IsSplitterFixed = true;
splMain.Panel1.Controls.Add(display);
m_splitterAdjusted = true;
根据调试器,panel1MinSize为0,panel2MinSize为2,Width,父窗口的大小为(160,25)。 因为拆分器是水平拆分器,所以我怀疑例外中的“宽度”实际上是高度,即25,使得例外是SplitterDistance(3),必须在0到0之间-因此是例外。
现在,如果窗口最小化,我只是不添加进度条,但是这样做的缺点当然是在恢复窗口时不显示进度条。 我猜另一种解决方案是在还原事件上添加进度条(如果尚未添加)。
我很好奇是否有更好(或不同)的解决方案。 谢谢!
我本来建议使用“不添加”方法,但是我看到您已经这样做了。
将作业保持待处理状态,直到发生还原事件为止,然后将其添加,然后将其保留在该位置。 最小化时,窗口没有大小,因此您根本无法将控件添加到窗体中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.