我新建一个项目,增加一个窗口,在窗口的Form1_Load事件中只写一行代码:
MessageBox.Show("OK");生成。然后再增加一个“继承的窗体”,继承自该窗口,这时,界面就弹出一个“OK”的提示框!!!我实在不理解,为什么继承一个窗口就会立即运行父窗口的代码?是否有其它方式避免这个问题的产生?虽然代码写成:
if (this.DesignMode == true)
{
}
else
{
    MessageBox.Show("OK");
}
可以避免,但所有事件都要写上这一行,代价有点高。

解决方案 »

  1.   

    双击新窗体面板,重写Load方法
      

  2.   

    如果你不重写父类的方法,就会默认执行,除非你override父类的load方法
      

  3.   

    C#的面向对象是这样的
    1.继续者拥有父的public + protected
    2.构造子类前,要先构造父(没有父也就没有子)子类可以通过override 或 new来定义自己的实现~不拼爹了~
      

  4.   

    不要用this.DesignMode,试试这样:if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
    {
        MessageBox.Show("OK");
    }
      

  5.   

    我可能没有说清,我不理解的是:在设计状态下,继承一个窗口时,为什么 VS2008 要“自做聪明”地帮我执行父窗口的 Load 中的代码。
    要知道,这是在设计状态下呀!!!而我父窗口的Load事件中的代码全是在运行状态下所要做的事情呀。
      

  6.   

    不想要父类 就自己override吧
      

  7.   

    继承一个窗口的时候,由于需要显示父窗体本来的样子,所以要实例化父窗体,所以就顺带着调用了 Load 事件,你的情况是弹出了一个对话框,这个在设计界面出来是感觉不太好,识别一下设计模式就好了,不需要在所有地方判断是否设计模式。
      

  8.   

    我不是连类的基本概念都不理解,而是想询问VS 2008 IDE这一层面的问题,我再进行一个更直接的对比吧:
    我们在父窗口的两个事件写代码:    private void Form1_Load(object sender, EventArgs e)
        {
          MessageBox.Show("Load");
        }    private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
          MessageBox.Show("MouseMove");
        }建立了继承Form1的窗口Form2时,为什么VS2008对父类的 Form1_Load 事件会执行,而对Form1_MouseMove却不执行,不管在你在设计环境下,Form2上鼠标怎么移,它就是不会 弹出任何提示。如果说子类窗口应该先执行父窗口的代码,为什么它不执行MouseMove,而只是“顺带着调用了 Load 事件”,是不是有它的必然?
    由于这个必然,是不是还有某些事件也会在设计环境下被 VS2008 执行(比如 Form1_Resize……)?究竟有多少事件 像 Form1_Load ,多少事件 像 Form1_MouseMove?它们区分的原则是什么(又回到原始的问题,它是什么原因导致的必然)?这个讨论应该是很有意思的。讨论时,大家可以先假定我是有25年编码经验的老人家的基础上回答,谢谢!
      

  9.   

    vs设计器截获了MouseMove消息,并不传递。如果你要避免,可以为你的父类加上 if(!this.DesignMode) 判断,而不需要为子类做判断。
      

  10.   

    在设计模式下要执行一些代码,这是为了尽量让设计界面上的控件表现得“所见即所得”。假设控件在设计界面上根本不渲染,那么vs的设计窗体也就无意义了。所以几乎所有情况下,都会让你的用户在设计窗口里渲染。但是假设你的控件在DesignMode模式下连MouseMove这些都灵敏地响应,那么vs的设计窗体显然就直接乱掉了,所以干脆,根本不让MouseMove事件执行。不过这毕竟是极少数。大多数情况,你还是要自己写 if(!this.DesignMode) 判断来自己区分这种情况。例如很多程序是默认在 Form_Load 的时候就连上数据库的,但是设计时我们往往没有配置好相关数据库,因此此时你往往就必须在 Form_Load 中判断、如果是设计模式则直接退出,避免vs设计模式垮掉。
      

  11.   

    如果你写一个form,它用定时器不断地让窗口里的一个Label显示刷新当前时间。然后你根据这个Form,继承其成为一个子form。那么在所见即所得地设计子form的时候,自然地,没有被设计区域覆盖的父form,那个时钟是在不断地跳动的!但是假设它不是简单地刷新Label,而是不断地MessageBox.Show,打断用户操作,那么显然你就需要写上 if(!DesignMode)判断了。可见写还是不写这个判断,是你编程是必须考虑的。这没有什么“是、不是”的简单定性答案。许多人只考虑到组件的运行时的代码,而不去考虑在设计器上显示的代码。许多程序员好像有严重惰性似地,即使你强调了10遍,他们也记不住应该抽出编码时间的百分之一来考虑什么地方需要写上 if (this.DesignMode) 判断这个问题。这样的程序员就是比较懒惰的。
      

  12.   

    谢谢SP1234,现在我的想法是 VS2008 可能是对“所见即所得”与“IDE的性能及操作性”做出的一些折衷。测试出以下事件有继承之效果:
    Form1_AutoValidateChanged
    Form1_BackColorChanged
    Form1_BackgroundImageChanged
    Form1_BindingContextChanged
    Form1_CausesValidationChanged
    Form1_ClientSizeChanged
    Form1_ControlAdded
    Form1_ControlRemoved
    Form1_CursorChanged
    Form1_DragEnter
    Form1_DragLeave
    Form1_DragOver
    Form1_FontChanged
    Form1_ForeColorChanged
    Form1_InputLanguageChanged
    Form1_Layout
    Form1_Load
    Form1_LocationChanged
    Form1_MaximumSizeChanged
    Form1_MinimumSizeChanged
    Form1_MouseCaptureChanged
    Form1_Move
    Form1_PaddingChanged
    Form1_Paint
    Form1_ParentChanged
    Form1_Resize
    Form1_RightToLeftChanged
    Form1_RightToLeftLayoutChanged
    Form1_Shown
    Form1_SizeChanged
    Form1_StyleChanged
    Form1_TextChanged
    Form1_VisibleChanged
    以下事件是我还没有测试出继承的效果(在设计环境下)
    Form1_Activated
    Form1_AutoSizeChanged
    Form1_BackgroundImageChanged
    Form1_ChangeUICues
    Form1_Click
    Form1_ContextMenuStripChanged
    Form1_Deactivate
    Form1_DockChanged
    Form1_DoubleClick
    Form1_DragDrop
    Form1_EnabledChanged
    Form1_Enter
    Form1_FormClosed
    Form1_FormClosing
    Form1_GiveFeedback
    Form1_HelpButtonClicked
    Form1_HelpRequested
    Form1_ImeModeChanged
    Form1_InputLanguageChanging
    Form1_KeyDown
    Form1_KeyPress
    Form1_KeyUp
    Form1_Leave
    Form1_MaximizedBoundsChanged
    Form1_MdiChildActivate
    Form1_MouseClick
    Form1_MouseDoubleClick
    Form1_MouseDown
    Form1_MouseEnter
    Form1_MouseHover
    Form1_MouseLeave
    Form1_MouseMove
    Form1_MouseUp
    Form1_PreviewKeyDown
    Form1_QueryAccessibilityHelp
    Form1_QueryContinueDrag
    Form1_RegionChanged
    Form1_ResizeBegin
    Form1_ResizeEnd
    Form1_Scroll
    Form1_SystemColorsChanged
    Form1_Validated
    Form1_Validating
    对于这些的区分,如果暂时找不到简单的原则,则还是要用你的建议:写代码时费点神考虑一下它在设计状态下要如何处理。
      

  13.   

    相对Run-Time Behavior ,微软是否有 Design-Time Behavior 的列表及说明?