【问题标题】:Modal winform not showing up模态winform没有出现
【发布时间】:2014-03-15 19:01:41
【问题描述】:

我有一个使用 VS 2010 (.NET 4.0) 开发的 .NET winforms 应用程序,操作系统是 Windows 7。在解决方案中,我有一个简单的表单,其中包含一个简单的日历控件。此表单在来自 2 个不同表单的按钮单击时调用。按钮点击调用如下:

// Parent Form
public class ParentForm : Form
{
// Button click event handler is as follows:

void btnCalendarClick(object sender, EventArgs e)
{
   // ...other code
   MyStatisClass.ShowCalendar();
}
}

//Calendar Form
public class CalendarForm : Form
{
// And the ShowCalendar method is as under..
public static void ShowCalendar()
{
using (CalendarForm frm = new CalendarForm())
{
   if(frm.ShowDialog() == DialogResult.OK) { SelectedDate = frm.LastSelectedDate; }
}
}

}

现在我有 2 个父表单的副本,它们在设计和代码上几乎相似。但是,在一个表单中单击按钮时,日历会显示,而在另一个表单的按钮单击时,它会打开,但不会显示自身。但是我可以在任务栏中看到它,并且必须在不选择任何内容的情况下通过单击任务栏中的十字来关闭它,因为它永远不会在屏幕上显示。我检查了控件的所有选项卡顺序,尝试在日历表单上执行 BringToFront 并在父表单上执行 SendToBack,尝试使用 InvokeRequired 属性检查交叉线程,但我没有看到表单。另外,我在每一个可能的地方都放了try catch,看看是否有异常发生;但它没有被击中,实际上表单打开得很好。请让我知道是否缺少任何阻止我显示此表单的内容?

谢谢, 布山

【问题讨论】:

  • 从发布的代码看来是不合理的,你的问题是“在设计上几乎相似”。
  • 您是否要同时显示 2 个对话框?

标签: c# winforms forms controls


【解决方案1】:

首先更改以下代码,因为您的静态方法在 CalendarForm 中。我不知道你的静态类在做什么,但你可以直接调用它,如下所示。

MyStatisClass.ShowCalendar(); change to below
CalendarForm .ShowCalendar();

这里的问题是你使用了 using 语句,它会在作用域结束后自动处理对象。所以去掉 using 语句,它就可以正常工作了。

我建议你看一下并阅读 msdn 中的“使用语句”。

public static void ShowCalendar()
{
   //using (CalendarForm frm = new CalendarForm())
   //{
     if(frm.ShowDialog() == DialogResult.OK) { SelectedDate = frm.LastSelectedDate; }
   //}
}

希望对你有帮助。

【讨论】:

  • 在模态表单周围使用 using 是完全可以的,通常是最佳实践。
  • 完全同意!但是在当前场景下,“使用”语句将不允许您出现。那么你当然必须重新考虑设计。
  • 但不是随便改东西。
  • 看看有人是新手,不知道“使用”的用法,他怎么能想到设计视角。这就是为什么我在回答中提到“看看并阅读使用声明”在 msdn 中”。这里唯一的观点是帮助他们,以便他们能够克服并学习更多。
  • 亲爱的。我很清楚 using 语句的目的。这里对日历表单的调用只是封装在一个静态方法中,这在其中一个调用表单中工作得非常好,而相同的代码只是不允许从第二个表单调用时显示该表单。正如我之前提到的,表单也被创建和加载;正如我在任务栏中看到的那样。但是,它不显示 UI 以便做一些有用的工作。是否需要检查 2 个表格的 Z 顺序? @Pan4321,我尝试了您的建议,但对我不起作用。我不太确定这里发生了什么。
【解决方案2】:

我已经解决了这个问题。顺便说一句,问题仍然存在,但我已经确定了原因;至少看起来是这样。问题是,包含 Monthcalendar 控件的 Form 的边框样式设置为 None,并且在设计器代码中设置了一些其他变量和属性。正如我之前提到的,另一种形式能够显示它,但在不同的机器上(Windows 7)。我的机器也有windows 7;但是我禁用了所有样式以优化性能,并且无法显示表单。我刚刚在我的机器上启用了样式并显示了日历。所以,我认为这应该是原因。但是,如果这是原因,那么我想到的下一个问题是为什么?谁有线索,请分享。 谢谢, 布山。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 2018-01-17
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多