玩轉控件:重繪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, 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);
            }
            else
                base.OnItemClick(hitInfo);
        }
    }

     

   回到窗體,重新定義窗體設計器的代碼InitializeComponent()

   沒錯,仍然需要使出拖控件大法,將DevExpress中DateEdit控件拖到窗體中,然后將窗體的設計代碼中InitializeComponent()方法剪切到窗體的.cs文件中,然后重新制定該DateEdit控件實例化對象即可。

 

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

 

        下面是運行效果圖:

    

   源碼下載鏈接

  源碼下載

 

    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM