C# 为什么要从设计器中插入非UI Windows.Forms组件?

C# 为什么要从设计器中插入非UI Windows.Forms组件?,c#,winforms,windows-forms-designer,C#,Winforms,Windows Forms Designer,在C#(和Visual Basic)中,您可以直接从表单设计器添加几个非UI组件(那些不是从System.Windows.Forms.Control继承的组件)。这些组件的示例包括System.Windows.Forms.FolderBrowserDialog和System.Windows.Forms.Timer 但是,使用UI设计器添加非UI控件而不是直接从代码实例化它们有什么好处呢?这背后有一个基本原理?如果您不需要设计时支持,并且您自己将负责编写标准代码来初始化和处理组件,那么您就不需要将

在C#(和Visual Basic)中,您可以直接从表单设计器添加几个非UI组件(那些不是从
System.Windows.Forms.Control
继承的组件)。这些组件的示例包括
System.Windows.Forms.FolderBrowserDialog
System.Windows.Forms.Timer


但是,使用UI设计器添加非UI控件而不是直接从代码实例化它们有什么好处呢?这背后有一个基本原理?

如果您不需要设计时支持,并且您自己将负责编写标准代码来初始化和处理组件,那么您就不需要将组件放到设计器中

在designer中使用非UI组件有以下好处:

  • 设计时支持
  • 标准代码(用于初始化和处置)
设计时支持

windows窗体中最强大的功能之一是能够使用designer设置组件属性

尽管
Timer
不是UI组件,但您可以在设计时设置其属性,如interval。这适用于许多其他组件,如
BindingSource
ErrorProvider
,您可以使用非常友好的属性网格、类型编辑器和类型转换器在设计时配置属性

  • 要为其他控件配置从属属性时;例如,通过将
    BindingSource
    添加到设计器,它使数据绑定非常容易
  • 当您需要使用扩展程序提供程序时,如
    帮助提供程序
    工具提示
    ,因为它们与其他控件相关,所以在设计模式下配置它们非常容易
  • 当您需要配置诸如
    DataSource
    DataMember
    之类的属性时,使用设计器和强大的属性网格功能非常友好
  • 组件将添加为类级字段,您可以使用deigner将其公开
  • 当您需要为组件使用
    Form
    Localizable
    功能时,使用designer完全可以使用该功能
  • 当您需要简单地添加或删除事件处理程序时,可以使用属性网格来完成
标准代码

如果查看设计器生成的代码,您将看到:

  • 为支持
    ISupportInitialize
    的组件生成的代码使用其
    BeginInit
    EndInit
  • 为组件生成代码,将
    this.components
    传递给构造函数,然后在
    Dispose

如果您不需要设计时支持,并且为组件编写标准代码,那么在代码中使用主题是完全可以的。

InitializeComponent()提供了您刚才删除的内容的代码,如果我理解的话correctly@brykneval我知道设计师在哪里声明和初始化组件,但是我不明白为非UI组件使用设计器的好处。您可以检查是否有实现
IDisposable
的对象,设计器是否在
Disposing(bool Disposing)
中添加
Dispose()
调用。或者查找变量名上的所有引用,查看是否添加了任何代码(除了显而易见的代码)。