4

使用我的几种表单,偶尔会遇到以下问题:我使用设计器(Visual Studio 2008,Windows Forms,.NET 2.0,VB.NET)编辑表单添加组件,后来才发现一些小调整被制作了(例如表单的大小突然改变了几个像素),并且控件被删除。这会悄无声息地发生——事件处理方法也会自动Handles删除它们的后缀,因此它们永远不会被调用,也不会出现编译器错误。我只是在很久以后才注意到或根本没有注意到,因为我正在处理表格中的不同区域。

例如,我有一个表单,其中左侧SplitContainer包含 Infragistics,右侧包含一个。我添加了一个新选项卡和其中的控件,它们运行良好。后来我发现列表视图的滚动条突然不可见,因为它的大小被关闭了,并且至少有一个控件从我没有处理的不同选项卡中删除。UltraListViewUltraTabControl

这是 WinForms Designer 还是 Infragistics 的已知问题?当然,我使用版本控制,因此我可以比较更改并将已删除的代码重新合并,但这是一个乏味的过程,不应该是必要的。有没有办法避免这种情况?发生这种情况有充分的理由吗?

Load一条线索是,被删除的控件可能具有预期在运行时而不是设计时运行的代码(例如事件处理程序),并且可能会引发异常。这会导致 Visual Studio 删除控件吗?

4

6 回答 6

10

这不是您问题的答案,但请记住您应该在加载中使用“DesignMode”。这可以避免在设计时出现奇怪的意外行为。

private void EureFormAbm_Load(object sender, System.EventArgs e)
{
    if (!DesignMode)
    {
        // Your code
    } /* if */
}

或者

private void EureFormAbm_Load(object sender, System.EventArgs e)
{
    if (DesignMode)
        return;
    // Your code
}
于 2010-04-20T22:18:26.437 回答
2

如果您可以重现问题,那么您可以确定原因是否是异常。启动 Visual Studio 的第二个实例并使用“工具->附加到进程”附加到第一个实例。然后继续重现问题,当抛出未处理的异常时,代码应该会中断。有关其他异常(可能已处理)的信息将在“输出”窗口中可见。

于 2010-04-21T01:06:24.320 回答
1

我发现 DesignMode 属性有时会产生意想不到的结果(丹尼尔的回答)。下面是我在基本控件类上的一个属性(我创建的大多数控件都继承自此),注释应该指出看起来像 hacky 代码的“原因”,但本质上这比 DesignMode 本身可靠得多。

    /// <summary>
    /// Indicates if the current view is being utilized in the VS.NET IDE or not.
    /// </summary>
    /// <remarks>The DesignMode property for a UserControl object will show that it is in DesignMode
    /// only if the immediate parent is viewed in the IDE; if it is a grand child of the object that is being viewed in the IDE,
    /// then the DesignMode property will not be true.
    /// This is a workaround</remarks>
    public bool InDesignMode
    {
        get
        {
            // Site.Design mode sometimes produces a better result.
            if (DesignMode || Site != null && Site.DesignMode)
                return true;
            Control parent = Parent;
            while (parent != null)
            {
                if (parent.Site != null && parent.Site.DesignMode)
                    return true;
                parent = parent.Parent;
            }

            // Note: I am not 100% sure about this one; I need to double check
            // if in design mode then entryAssembly will be null. This check is 
            // needed because DesignMode property is only true for the control
            // that is actively being designed, so child controls will be false...
            // We do check the Parent heirarchy in InDesignMode but in some 
            // cases Parent will not be set before the check is required.
            var entryAssembly = Assembly.GetEntryAssembly();
            if (entryAssembly == null)
                return true;

            return false;
        }
    }
于 2010-04-21T02:44:15.823 回答
1

这对你来说不是一个真正的答案,但这里有一些我发现有帮助的建议。

A) 请参阅@Daniel Dolz 的回答。我全心全意地建议您始终按照他的建议行事,除非您完全避免放入非 UI 代码(或任何代码)Form_Load。这实际上解决了很多问题,尤其是那些在设计师中出现的异常和设计师表现缓慢的问题。

B)尽可能人为地:

切勿在Windows 窗体中编辑 Designer.cs 。

好的,有时您必须这样做,但这不是进行常规开发的地方。第三方控件会有需要您这样做的错误,但是当您直接更改设计器文件时,这应该是非常罕见的一天。帮助管理此问题的一种方法是,如果您不希望设计器自动调整某些内容,请将其复制到您的常规.cs文件中。这并不能涵盖所有内容,但请记住这一点。

C)另外,您是否知道您可以通过 IDE锁定布局,以防止鼠标点击杂乱无章地弄乱您的一切?这将抢占您遇到的一些“自动更新”。

Parting Shot在我目前的项目之前,我在一个大型 Windows 窗体项目上工作了两年多,我只能说,直到我们结束编辑设计师的人,除了非常小的编辑,并要求他们放入设计模式检查,我们只有问题。离开网络项目后,我们很难接受这个想法,因为我们已经习惯了编辑标记,但designer.cs与标记不同。

于 2010-04-21T00:38:45.987 回答
0

当操作系统出现问题时,我已经看到Visual Basic 6.0和早期的 .NET 会发生这种情况。我们不得不重新启动和修复。

于 2010-04-20T18:41:06.710 回答
0

另一个好的做法是不要删除默认的表单构造函数。IDE 使用它们,即使您的逻辑没有。锁定也很有用。

于 2010-04-21T13:26:13.940 回答