例如ToolStripTextBox类,里面的封装就是一个TextBox控件。.NET的类库提供了ToolStripComBox和ToolStripProgressBar两个类。这些类都是从ToolStripControlHost类派生的,ToolStripControlHost允许在菜单栏中或工具栏上承载自定义控件,承载的控件是通过ToolStripControlHost类的构造 函数的参数传递进去的,因此可以事先实例化,一个控件实例,然后再实例化ToolStripControlHost对象,并把控件实例通过构造函数的参数传递给ToolStripControlHost实例。虽然ToolStripControlHost类是可以直接使用的,但是为了方便是从ToolStripControlHost派生一个子类,并把要承载的控件封装在子类中,就好像NET类库所提供的ToolStripTextBox那样。经过这样封装后,就可以直接使用了。不必每次调用都要实例化一个控件的实例,大大的提高了类型的可用性。

  例如:

定义一个ToolStripDateTimerPciker类,派生自ToolStripControlHost类,

  在ToolStripDateTimePicker的构造函数调用时,通过base(...)来调用基类的构造函数,并使用new运算符创建一个DateTimerPicker实例作为参数传递。从基类的Control属性可以获得承载的DateTimerPicker控件的实例,并用DateTimePicker属性来封装m_Picker字段方便调用时获得被封装的DateTimePicker控件的实例。Value属性封装了m_picker的Value属性,表示当前选择的日期

  DropDown、CloseUp和ValueChanged三个事件分别对应m_Pciker的三个事件,使用add和remove操作符来添加和移除事件关联的方法。

  1. public class ToolStripDateTimePicker : ToolStripControlHost
  2. {
  3. private DateTimePicker m_Picker = null;
  4. public ToolStripDateTimePicker() : base(new DateTimePicker())
  5. {
  6. m_Picker = base.Control as DateTimePicker;
  7. //对控件进行设置,默认时期显示格式
  8. m_Picker.Format = DateTimePickerFormat.Custom;
  9. //设置格式
  10. m_Picker.CustomFormat = "yyyy年MM月dd日";
  11. }
  12.  
  13. #region 属性
  14. /// <summary>
  15. /// 允许的日期最大值
  16. /// </summary>
  17. public DateTime MaxDate
  18. {
  19. get { return m_Picker.MaxDate; }
  20. set { m_Picker.MaxDate = value; }
  21. }
  22. /// <summary>
  23. /// 允许的日期最小值
  24. /// </summary>
  25. public DateTime MinDate
  26. {
  27. get { return m_Picker.MinDate;}
  28. set { m_Picker.MinDate = value; }
  29.  
  30. }
  31. /// <summary>
  32. /// 已经选中的日期
  33. /// </summary>
  34. public DateTime Value
  35. {
  36. get { return m_Picker.Value; }
  37. set { m_Picker.Value = value; }
  38. }
  39. //获取被封装的控件
  40. public DateTimePicker DateTimePicker
  41. {
  42. get { return m_Picker; }
  43. }
  44. #endregion
  45.  
  46. #region
  47. //当日期选择框打开时发生
  48. public event EventHandler DropDown
  49. {
  50. add { m_Picker.DropDown += value; }
  51. remove { m_Picker.DropDown -= value; }
  52. }
  53. ///当日期选择关闭时
  54. public event EventHandler CloseUP
  55. {
  56. add { m_Picker.CloseUp += value; }
  57. remove { m_Picker.CloseUp -= value; }
  58. }
  59. //当选择的日期发生改变时
  60. public event EventHandler ValueChanged
  61. {
  62. add { m_Picker.ValueChanged += value; }
  63. remove { m_Picker.ValueChanged -= value; }
  64. }
  65. #endregion
  66. }

添加一个MenuStrip控件

在构造函数页面添加

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace 自定义承载控件
  11. {
  12. public partial class Form1 : Form
  13. {
  14. ToolStripDateTimePicker mndtPicker = null;
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. //向报表菜单添加自定义菜单项
  19. mndtPicker = new ToolStripDateTimePicker();
  20. mndtPicker.MaxDate = new DateTime(, , );
  21. mndtPicker.MinDate = new DateTime(,,);
  22. toolStripMenuItem1.DropDownItems.Add(mndtPicker);
  23. // 处理事件
  24. mndtPicker.ValueChanged += mndtPicker_ValueChanged;
  25. }
  26. void mndtPicker_ValueChanged(object sender, EventArgs e)
  27. {
  28. MessageBox.Show("您选择了:" + mndtPicker.Value.ToLongDateString());
  29. }
  30.  
  31. private void Form1_Load(object sender, EventArgs e)
  32. {
  33.  
  34. }
  35. }
  36. }

  

C# 自定义承载控件的更多相关文章

  1. 演练:使用属性自定义 DataGrid 控件

    演练:使用属性自定义 DataGrid 控件 Silverlight   此主题尚未评级 - 评价此主题   Silverlight DataGrid 控件支持常用表格式设置选项,例如交替显示不同的行 ...

  2. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  3. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  4. asp.net webform 自定义分页控件

    做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...

  5. arcgis api for js共享干货系列之二自定义Navigation控件样式风格

    arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...

  6. C# DataGridView自定义分页控件

    好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...

  7. C# 自定义FileUpload控件

    摘要:ASP.NET自带的FileUpload控件会随着浏览器的不同,显示的样式也会发生改变,很不美观,为了提高用户体验度,所以我们会去自定义FileUpload控件 实现思路:用两个Button和T ...

  8. C#Winform VScrollBar+Pannel自定义列表控件(原)

    该控件的主要实现思路是用的objective-c中的自定义控件思路,主视图中放子视图 效果图 (窗体调用代码) public partial class Form1 : RibbonForm { Li ...

  9. 自定义圆形控件 RoundImageView

    1.自定义圆形控件 RoundImageView package com.ronye.CustomView; import android.content.Context; import androi ...

随机推荐

  1. 对CountDownLatch的初步学习

    CountDownLatch的中文翻译为"闭锁",在JDK1.5中 CountDownLatch类加入进来.为程序猿进行并发编程提供有利的帮助. 首先我们先看看JDK文档中对于Co ...

  2. 'react-scripts' is not recognized as an internal or external command

    React项目在执行npm start的时候报下面的错误: 解决办法:把项目目录中node_modules文件夹删掉,重新npm install一下,然后再执行npm start

  3. Spring事务管理详解_基本原理_事务管理方式

    1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事 ...

  4. 如何修改帝国cms文章点击量默认值和成倍增加

    我们在帝国cms发布完文章,在不点击的情况下,“点击量”默认显示为0,请问有什么方法,修改关注默认值吗?这个可以在增加信息时,“特殊属性”标签里修改点击量,如下图 有朋友问有没其他好的方法快速增加.成 ...

  5. Linux下高并发socket最大连接数各种限制的调优

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  6. SQL语法集合

    查询 select   *   from table limit 0,10     取0位置后面的10条记录 limit   0     表示从第一条记录开始   起始位置从0开始 10    表示取 ...

  7. 协程.md

    一. # 可迭代l = [ i for i in range(10) ] # l是可迭代的,但不是迭代器for idx in l:    print(idx)    # range是个迭代器for i ...

  8. Linux命令:linux软链接的创建、删除和更新---ln

    大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作.同样的,在系统级别也有.在Windows系列中,我们称其为快捷方式,在Linux中我们称其为链接(基本上都差不多了,其中可能有 ...

  9. lua加载函数require和dofile

    lua加载函数require和dofile Lua提供高级的require函数来加载运行库.粗略的说require和dofile完成同样的功能但有两点不同: 1. require会搜索目录加载文件; ...

  10. JS 8-3 prototype属性

    动态修改Student.prototype的属性时,会影响已创建或将要创建的实例. 如果将整个Student.prototype赋值为新的对象,对已经创建的实例是不会修改的,会影响后续创建的实例. n ...