-
缘由
这两天在维护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, 1, 0, 0, 0);DateTime tempDate = dt.AddMonths(1).AddDays(-1);tempDate = new DateTime(tempDate.Year, tempDate.Month, tempDate.Day, 23, 59, 59);OnDateTimeCommit(tempDate, false);}elsebase.OnItemClick(hitInfo);}}
-
回到窗体,重新定义窗体设计器的代码InitializeComponent()
没错,仍然需要使出拖控件大法,将DevExpress中DateEdit控件拖到窗体中,然后将窗体的设计代码中InitializeComponent()方法剪切到窗体的.cs文件中,然后重新制定该DateEdit控件实例化对象即可。
this.dateEdit1 = new KzxDateEdit();
下面是运行效果图:

本文介绍了如何通过继承DevExpress的DateEdit控件并自定义组件类,实现按月查询的功能。作者提供了核心代码,展示如何设置显示格式、禁用当天日期并创建自定义的Vista模式弹出日历,以便用户能方便地选择月份。
5405

被折叠的 条评论
为什么被折叠?



