C# 自定义承载控件
例如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操作符来添加和移除事件关联的方法。
public class ToolStripDateTimePicker : ToolStripControlHost
{
private DateTimePicker m_Picker = null;
public ToolStripDateTimePicker() : base(new DateTimePicker())
{
m_Picker = base.Control as DateTimePicker;
//对控件进行设置,默认时期显示格式
m_Picker.Format = DateTimePickerFormat.Custom;
//设置格式
m_Picker.CustomFormat = "yyyy年MM月dd日";
} #region 属性
/// <summary>
/// 允许的日期最大值
/// </summary>
public DateTime MaxDate
{
get { return m_Picker.MaxDate; }
set { m_Picker.MaxDate = value; }
}
/// <summary>
/// 允许的日期最小值
/// </summary>
public DateTime MinDate
{
get { return m_Picker.MinDate;}
set { m_Picker.MinDate = value; } }
/// <summary>
/// 已经选中的日期
/// </summary>
public DateTime Value
{
get { return m_Picker.Value; }
set { m_Picker.Value = value; }
}
//获取被封装的控件
public DateTimePicker DateTimePicker
{
get { return m_Picker; }
}
#endregion #region
//当日期选择框打开时发生
public event EventHandler DropDown
{
add { m_Picker.DropDown += value; }
remove { m_Picker.DropDown -= value; }
}
///当日期选择关闭时
public event EventHandler CloseUP
{
add { m_Picker.CloseUp += value; }
remove { m_Picker.CloseUp -= value; }
}
//当选择的日期发生改变时
public event EventHandler ValueChanged
{
add { m_Picker.ValueChanged += value; }
remove { m_Picker.ValueChanged -= value; }
}
#endregion
}
添加一个MenuStrip控件
在构造函数页面添加
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace 自定义承载控件
{
public partial class Form1 : Form
{
ToolStripDateTimePicker mndtPicker = null;
public Form1()
{
InitializeComponent();
//向报表菜单添加自定义菜单项
mndtPicker = new ToolStripDateTimePicker();
mndtPicker.MaxDate = new DateTime(, , );
mndtPicker.MinDate = new DateTime(,,);
toolStripMenuItem1.DropDownItems.Add(mndtPicker);
// 处理事件
mndtPicker.ValueChanged += mndtPicker_ValueChanged;
}
void mndtPicker_ValueChanged(object sender, EventArgs e)
{
MessageBox.Show("您选择了:" + mndtPicker.Value.ToLongDateString());
} private void Form1_Load(object sender, EventArgs e)
{ }
}
}
C# 自定义承载控件的更多相关文章
- 演练:使用属性自定义 DataGrid 控件
演练:使用属性自定义 DataGrid 控件 Silverlight 此主题尚未评级 - 评价此主题 Silverlight DataGrid 控件支持常用表格式设置选项,例如交替显示不同的行 ...
- 安卓自定义组合控件--toolbar
最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- asp.net webform 自定义分页控件
做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...
- arcgis api for js共享干货系列之二自定义Navigation控件样式风格
arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
- C# 自定义FileUpload控件
摘要:ASP.NET自带的FileUpload控件会随着浏览器的不同,显示的样式也会发生改变,很不美观,为了提高用户体验度,所以我们会去自定义FileUpload控件 实现思路:用两个Button和T ...
- C#Winform VScrollBar+Pannel自定义列表控件(原)
该控件的主要实现思路是用的objective-c中的自定义控件思路,主视图中放子视图 效果图 (窗体调用代码) public partial class Form1 : RibbonForm { Li ...
- 自定义圆形控件 RoundImageView
1.自定义圆形控件 RoundImageView package com.ronye.CustomView; import android.content.Context; import androi ...
随机推荐
- laravel出现No hint path defined for [sudosu]的解决方法
今天ytkah在部署laravel项目时出现了No hint path defined for [sudosu]的问题,大概意思是没有定义sudosu的提示路径,那我们找一下配置文件有没相关设置,看到 ...
- [phomeflashpic]怎样调用帝国CMS图片幻灯效果
今天改网站时试着用帝国cms的[phomeflashpic]标签调用图片作为首页幻灯片,默认是[phomeflashpic]0,3,300,235,0,0,13,3[/phomeflashpic],其 ...
- 自定义安装visual studio 2010开发asp.net
VS2010的安装对于VS的安装大家肯定都熟悉,不过我在很多地方看到的是大家讲VS的全部组件都安装了,不但浪费磁盘空间,还降低了系统性能,除此之外,还有人安装了VS之后不知道顺手把MSDN安装上,害得 ...
- 晨枫U盘启动盘制作工具V4.0-安装原版Win7
第一类方法(32位64位系统通用): [1]找到Windows7系统的iso镜像,用UltraISO或者WinRAR打开iso镜像,然后提取/解压所有文件到你的U盘根目录. [2]在你的U盘里找到名为 ...
- 快学Scala 2
控制结构和函数 1.在Scala中,几乎所有构造出来的语法结构都有值.这个特性是为了使得程序更加精简,也更易读. (1)if表达式有值 (2)块也有值——是它最后一个表达式的值 (3)Scala的fo ...
- tortoiseSVN版本合并(merge)
原文地址:http://blog.163.com/qq371557620@yeah/blog/static/8428365820172110320574/ 编码过程中,我们经常会遇到需要多个分支并行开 ...
- PHP递归方法实现前序、中序、后序遍历二叉树
二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree). class Node { public $value; pub ...
- Spark DataFrame列的合并与拆分
版本说明:Spark-2.3.0 使用Spark SQL在对数据进行处理的过程中,可能会遇到对一列数据拆分为多列,或者把多列数据合并为一列.这里记录一下目前想到的对DataFrame列数据进行合并和拆 ...
- 【Java】-NO.12.Java.2.OCJP.1.001-【Java OCJP】-
1.0.0 Summary Tittle:[Java]-NO.12.Java.2.OCJP.1.001-[Java OCJP]- Style:Java Series:OCJP Since:2017-0 ...
- jenkins 常见问题汇总
1.jenkins api调用 https://my.oschina.net/sanpeterguo/blog/197931 其中,有个错误的地方,带参数构建时,使用的时POST方法,如下: curl ...