创建 ValueButtonLib 控件库和 ValueButton 控件 在“文件”菜单上,指向“新建”,然后单击“项目”以打开“新建项目”对话框。 
在“C# 项目”列表中,选择“Windows 控件库”项目模板,然后在“名称”框中键入 ValueButtonLib。 
注意 Windows 控件库模板在 Visual Basic 和 Visual C# .NET 的标准版中不可用。有关更多信息,请参阅 Visual Basic 标准版功能或 Visual C# 标准版的功能。
默认情况下,项目名称 ValueButtonLib 也会分配到根命名空间中。根命名空间用于限定程序集中的组件名。例如,如果两个程序集都提供名为 ValueButton 的组件,则可以使用 ValueButtonLib.ValueButton 指定 ValueButton 组件。
在解决方案资源管理器中,右击 UserControl1.cs,并从快捷菜单中选择“查看代码”。 
找到 class 语句 public class UserControl1,将 UserControl1 更改为 ValueButton 以更改组件的名称。 
找到构造函数 public UserControl1(),将它更改为 public ValueButton()。 
在 Class 语句,将该控件从 System.Windows.Forms.UserControl 继承的类型更改为 System.Windows.Forms.Button。这允许继承的控件继承 Button 控件的所有功能。 
在解决方案资源管理器中,单击 UserControl1.cs,并在“属性”窗口中,将 FileName 属性更改为 ValueButton.cs。 
从“文件”菜单中,选择“全部保存”来保存项目。 
注意,设计器已不再可用。因为 Button 控件自己完成绘制,所以无法在设计器中修改它的外观。除非在代码中对其进行修改,否则它的可视化表示形式将与它从中继承的类(即 Button)的表示形式完全相同。 将属性添加到继承的控件中
继承的 Windows 窗体控件的可能用途之一是创建与标准 Windows 窗体控件的外观相同、但公开自定义属性的控件。在本节中,您将向控件中添加名为 ButtonValue 的属性。添加 Value 属性 在解决方案资源管理器中,右击“ValueButton.cs”,然后在快捷菜单中单击“查看代码”。 
找到 class 语句。在紧靠 { 的后面键入下面的代码: 
// Creates the private variable that will store the value of your 
// property.
private int varValue;
// Declares the property.
public int ButtonValue
{
   // Sets the method for retrieving the value of your property.
   get
   {
      return varValue;
   }
   // Sets the method for setting the value of your property.
   set
   {
      varValue = value;
   }
}
此代码设置存储和检索 ButtonValue 属性的方法。get 语句设置返回到存储在私有变量 varValue 中的值的值,set 语句通过使用 value 关键字设置私有变量的值。 从“文件”菜单中,选择“全部保存”来保存项目。 
测试控件
控件不是独立的项目,它们必须寄宿在容器中。若要测试控件,必须提供一个运行该控件的测试项目。还必须通过生成(编译)该控件使其可由测试项目访问。在本节中,您将生成控件,并在 Windows 窗体中对其进行测试。生成控件 在“生成”菜单上单击“生成”。 
生成应成功,不存在任何编译器错误或警告。 创建测试项目 在“文件”菜单上,指向“添加项目”,然后单击“新建项目”以打开“添加新项目”对话框。 
选择“Visual C# 项目”节点,然后单击“Windows 应用程序”。 
在“名称”框中键入 Test。 
在解决方案资源管理器中,右击测试项目的“引用”节点,然后从快捷菜单中选择“添加引用”以显示“添加引用”对话框。 
单击标记为“项目”的选项卡。 
双击 ValueButtonLib 项目,并注意该项目此时出现在“选定的组件”窗格中。 
添加引用后,应将新控件添加到工具箱。如果您的控件已经出现在工具箱中,则应该跳过下一节。 将控件添加到工具箱 右击工具箱,然后从快捷菜单中选择“自定义工具箱”。 
“自定义工具箱”对话框打开。 选择“.NET 框架组件”选项卡并单击“浏览”。浏览到 ValueButtonLib\bin\debug 文件夹并选择 ValueButton.dll。 
ValueButton 出现在“自定义工具箱”对话框的组件列表中。 在“自定义工具箱”对话框中,单击 ValueButton 旁的框并关闭窗口。 
ValueButton 被添加到选定的工具箱的选项卡上。 将控件添加到窗体 在解决方案资源管理器中,右击“Form1.cs”,然后从快捷菜单中选择“视图设计器”。 
在工具箱中,向下滚动直到到达标记为 ValueButton 的图标。双击该图标。 
窗体上显示一个“ValueButton”。 右击“ValueButton”并从快捷菜单中选择“属性”。 
在“属性”窗口中检查该控件的属性。注意,它们与标准按钮公开的属性相同,不同的是有一个附加属性 ButtonValue。 
将 ButtonValue 属性设置为 5。 
在“工具箱”的“Windows 窗体”选项卡中,双击“标签”将 Label 控件添加到窗体中。 
将标签重新定位到窗体中心。 
双击 valueButton1。 
代码编辑器打开并显示 ValueButton1_Click 事件。 键入以下代码行。 
label1.Text = valueButton1.ButtonValue.ToString();
在解决方案资源管理器中,右击“测试”,然后从快捷菜单中选择“设为启动项目”。 
从“调试”菜单中选择“启动”。 
出现 Form1。 单击 valueButton1。 
Label1 中显示数字“5”,说明继承控件的 ButtonValue 属性已经通过 ValueButton1_Click 方法传递到 Label1。这样,ValueButton 控件便继承了标准 Windows 窗体按钮的所有功能,但是公开了一个附加的自定义属性。啊~~~~~~~~ 搞定  

解决方案 »

  1.   

    CodeCai(GrowWithC#)
    is my new id (not enough scores to ask questions)
      

  2.   

    像CODECAI所说的做,是否会有什么影响呢.
    如版本--不可能一次就做得完全的.每次都要生成DLL,比较麻烦.
    性能速度--或者可以忽略.
      

  3.   

    把控件名加到窗体的form.cotrols.add();
      

  4.   

    好多人说C#不可以做类似OCX的控件,可是可以的,很简单,只是它生成的是DLL而不是OCX
      

  5.   

    关注!
    在工作过程中,生成OCX 或DLL 都很不方便,每次改动OCX后都要重生成.这可涉及版本升级的问题.有时会导致版本不谦容的问题.最好C#能实现像VFP的那种可视类就好了.
      

  6.   

    生成DLL有什么不好吗?大家都可以引用,我们就把好多控件包装了一下,然后生成一个类库(DLL),大家都用就是了。如果涉及到版本号的问题,可以把版本号写成固定的就是了,比如我们在调试时经常把版本号默认为1.0.1.1。
      

  7.   

    TO:WxmJun(FBI) 
    在.NET中, 系统不再使用登录数据库(Registry)来维护DLL的位置和版本信息
    ,所有DLL文件都程序放到同一个目录里, 使得DLL Hell 的问题不再,另外,由于在ASP.NET下 IIS不再锁定DLL文件,因此 你可以在服务不中断的情况下直接升级DLL(不用重新注册在启动IIS,将新版DLL拷贝过去就可以了)
      

  8.   

    升级控件dll对程序无影响且微软规定必须编译为DLL