玩转控件:重绘DEVEXPRESS中DateEdit控件 —— 让DateEdit支持只选择年月 (提供源码下载)

  前言

上一篇博文《玩转控件:重绘ComboBox —— 让ComboBox多列显示》中,根据大家的回馈,ComboBox已经支持筛选了,更新见博文最后最后最后面.

  奇葩

这两天遇到一个很“诡异”的情况,之前手机拦截短信一直用腾讯手机管家,这两天发神经,把腾讯手机管家卸载掉,换成360手机管家。然后一如既往的设置好闹钟,睡觉.. 结果尼玛一觉睡到自然醒!拿过手机一看11:35am,手机闹钟居然没响!我很希望今天是星期六,为此我还狠劲的捏了下我白里透红的小脸,却无法扭转今天星期五的窘境。 这还不是最奇葩的,奇葩的是,我拿起手机惊奇的发现:360不见了...腾讯也不见了...闹钟也不响了...我凌乱了. 不知道有没有人遇到过类似的问题、

  缘由

这两天在维护DevExpress控件开发的报表,测试人员提出报表查询条件需要按月查询,我木讷的对着Dev自带的DateEdit控件许久,又找了几个Dev其他的时间控件,没有一个可以达到需求标准,于是有了下文:本篇博文代码部分来自网络,地址:http://www.devexpress.com/Support/Center/Question/Details/CQ60337

  故技重施:新建组件

根据最近看了3遍的《新三国演义》中,诸葛亮占荆州后收取零陵时,一屠夫的话:"说出吾名,吓汝一跳"。随将该组件类前缀用鄙人姓名字母的缩写,使其继承DevExpress的DateEdit控件类,如下:

  public partial class KzxDateEdit : DateEdit

我用的DevExpress控件是v10.1的,经过测试DevExpress神似在v7.1以上才支持Vista模式.(此处未经考证,如官方人员发现,请将此言论归为 大言不惭 之类别!)

下面贴出核心代码:

 public partial class KzxDateEdit : DateEdit
{
public KzxDateEdit()
{
InitializeComponent();
Properties.VistaDisplayMode = DevExpress.Utils.DefaultBoolean.True;
Properties.DisplayFormat.FormatString = "yyyy-MM";
Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
Properties.Mask.EditMask = "yyyy-MM";
Properties.ShowToday = false;
} public KzxDateEdit(IContainer container)
{
container.Add(this); InitializeComponent();
}
protected override PopupBaseForm CreatePopupForm()
{
if (Properties.VistaDisplayMode == DevExpress.Utils.DefaultBoolean.True)
return new CustomVistaPopupDateEditForm(this);
return new PopupDateEditForm(this);
} }
public class CustomVistaPopupDateEditForm : VistaPopupDateEditForm
{
public CustomVistaPopupDateEditForm(DateEdit ownerEdit) : base(ownerEdit) { }
protected override DateEditCalendar CreateCalendar()
{
return new CustomVistaDateEditCalendar(OwnerEdit.Properties, OwnerEdit.EditValue);
}
}
public class CustomVistaDateEditCalendar : VistaDateEditCalendar
{
public CustomVistaDateEditCalendar(RepositoryItemDateEdit item, object editDate) : base(item, editDate) { } protected override void Init()
{
base.Init();
this.View = DateEditCalendarViewType.YearInfo;
} protected override void OnItemClick(DevExpress.XtraEditors.Calendar.CalendarHitInfo hitInfo)
{
DayNumberCellInfo cell = hitInfo.HitObject as DayNumberCellInfo;
if (View == DateEditCalendarViewType.YearInfo)
{
DateTime dt = new DateTime(DateTime.Year, cell.Date.Month, , , , ); DateTime tempDate = dt.AddMonths().AddDays(-);
tempDate = new DateTime(tempDate.Year, tempDate.Month, tempDate.Day, , , );
OnDateTimeCommit(tempDate, false);
}
else
base.OnItemClick(hitInfo);
}
}
   回到窗体,重新定义窗体设计器的代码InitializeComponent()

没错,仍然需要使出拖控件大法,将DevExpress中DateEdit控件拖到窗体中,然后将窗体的设计代码中InitializeComponent()方法剪切到窗体的.cs文件中,然后重新制定该DateEdit控件实例化对象即可。

 //this.dateEdit1 = new DevExpress.XtraEditors.DateEdit();
this.dateEdit1 = new KzxDateEdit();

下面是运行效果图:

aaarticlea/png;base64,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" alt="" />

   源码下载链接

源码下载

上一篇:[iOS] 利用 NSAttributedString 进行富文本处理


下一篇:<转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明