自定义日期控件的实现【WinForm版】【原创】

先上图。

要点:

  • 双缓冲
  • this.SuspendLayout();   this.ResumeLayout();
  • 堆控件
  • 写委托事件

     一.双缓冲

      this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                     ControlStyles.ResizeRedraw |
                     ControlStyles.AllPaintingInWmPaint, true);

     二.SuspendLayout  &  ResumeLayout

          临时的挂起控件属性层

          恢复挂起的控件属性层

     三.堆控件

          InitialMycalendar(date);

          

ContractedBlock.gif ExpandedBlockStart.gif private void InitialMycalendar(DateTime date)
     {
 1            this.SuspendLayout();
 2
 3            this.Today = date;
 4            this.Today_Year = date.Year;
 5            this.Today_Month = date.Month;
 6            this.Today_Day = date.Day;
 7            //自定义显示格式
 8            lb_date.Text = Today_Year + "" + Today_Month + "";
 9            //周标题数组
10            WeekScheme[0= new Label();
11            WeekScheme[1= new Label();
12            WeekScheme[2= new Label();
13            WeekScheme[3= new Label();
14            WeekScheme[4= new Label();
15            WeekScheme[5= new Label();
16            WeekScheme[6= new Label();
17
18            WeekScheme[0].Text = "Su";
19            WeekScheme[1].Text = "Mo";
20            WeekScheme[2].Text = "Tu";
21            WeekScheme[3].Text = "We";
22            WeekScheme[4].Text = "Th";
23            WeekScheme[5].Text = "Fr";
24            WeekScheme[6].Text = "Sa";
25            //添加控件
26            this.Controls.AddRange(WeekScheme);
27            //获取当月天数
28            ThisMonthDays = getSumDaysInThisMonth();
29
30            for (int i = 0; i < 42; i++)
31ExpandedBlockStart.gifContractedBlock.gif            {
32                try
33ExpandedSubBlockStart.gifContractedSubBlock.gif                {
34                    DateTime dt = DateTime.Parse(Today_Year + "-" + Today_Month + "-01").AddDays(i);
35                    if (i < ThisMonthDays)
36ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
37                        //日数组
38                        MonthNode[i] = new DayNode(dt);
39                        MonthNode[i].SelectedDay += new MouseEventHandler(MyCalendar_SelectedDay);
40                        MonthNode[i].MoveLeave += new EventHandler(MyCalendar_MoveLeave);
41                        MonthNode[i].MoveOver += new EventHandler(MyCalendar_MoveOver);
42
43                    }

44                    else
45ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
46                        MonthNode[i] = null;
47                    }

48                    if (dt.CompareTo(date) == 0)
49ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
50                        SelectedDayNode = MonthNode[i];
51
52                    }

53                }

54                catch
55ExpandedSubBlockStart.gifContractedSubBlock.gif                {
56
57                }

58            }

59            if (SelectedDayNode != null)
60ExpandedBlockStart.gifContractedBlock.gif            {
61                SelectedDayNode.Controls[0].BackColor = Color.Tomato;
62            }

63            //添加控件
64            this.Controls.AddRange(MonthNode);
65            this.DrawAllTheNodes();
66            this.ResumeLayout();
     }

 

PS:

     如何计算某月的天数?

          TimeSpan myTime = DateTime.Parse(Today_Year + "-" + Today_Month + "-01").AddMonths(1).AddDays(-1) - DateTime.Parse(Today_Year + "-" + Today_Month + "-01");
          return myTime.Days + 1;

          

     四.写委托事件     

          //声明事件部分

          public event SelectButtonHandler OnSelect;

           //调用部分

          if (OnSelect != null)
            {
                OnSelect(sender, new SelectNodeAgs(this.SelectedDayNode.DayOfMonth));
            }

关键的要点都在这里了。

     还可以根据实际的项目的情况扩展控件。

     最基本的:可以选取时间的TextBox 控件。

     上图中就是这个控件的实现图。

 

 

转载于:https://www.cnblogs.com/wuhucome888/archive/2009/03/03/1402526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值