This repository has been archived by the owner on Sep 11, 2023. It is now read-only.
/
WeekNumberControl.cs
102 lines (87 loc) · 3.68 KB
/
WeekNumberControl.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using DevExpress.XtraScheduler;
using DevExpress.XtraScheduler.Drawing;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DXSample {
public partial class WeekNumberControl : Control {
private SchedulerControl _Scheduler;
public SchedulerControl Scheduler {
get {
return _Scheduler;
}
set {
if(_Scheduler == value)
return;
if(_Scheduler != null) {
_Scheduler.VisibleIntervalChanged -= _Scheduler_VisibleIntervalChanged;
_Scheduler.CustomDrawTimeCell -= _Scheduler_CustomDrawTimeCell;
}
_Scheduler = value;
_Scheduler.VisibleIntervalChanged += _Scheduler_VisibleIntervalChanged;
_Scheduler.CustomDrawTimeCell += _Scheduler_CustomDrawTimeCell;
Invalidate();
}
}
DateTime Start { get; set; }
List<RectParameters> WeekRectParameters { get; set; }
public WeekNumberControl() {
InitializeComponent();
WeekRectParameters = new List<RectParameters>();
for(int i = 0; i < 5; i++) {
WeekRectParameters.Add(new RectParameters());
}
}
void _Scheduler_CustomDrawTimeCell(object sender, CustomDrawObjectEventArgs e) {
MonthSingleWeekCell cell = e.ObjectInfo as MonthSingleWeekCell;
if(cell == null)
return;
if(cell.Interval.Start.DayOfWeek == DayOfWeek.Monday) {
for(int i = 0; i < 5; i++) {
if(cell.Interval.Start == Start.AddDays(i * 7)) {
WeekRectParameters[i] = new RectParameters() { Y = e.Bounds.Y, Height = e.Bounds.Height };
}
}
Invalidate();
}
}
void _Scheduler_VisibleIntervalChanged(object sender, EventArgs e) {
Start = Scheduler.Start;
}
protected override void OnPaint(PaintEventArgs pe) {
base.OnPaint(pe);
if(Scheduler == null)
return;
Pen pen = new Pen(Brushes.Black);
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
Rectangle monthRect;
for(int i = 0; i < 5; i++) {
monthRect = new Rectangle(new Point(pe.ClipRectangle.Location.X, WeekRectParameters[i].Y),
new Size(pe.ClipRectangle.Width - 1, WeekRectParameters[i].Height));
pe.Graphics.DrawRectangle(pen, monthRect);
int numberStart = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(Start.AddDays(7 * i), CalendarWeekRule.FirstDay, DayOfWeek.Monday);
int numberEnd = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(Start.AddDays(7 * i + 6), CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);
string weekNumber = "";
if(numberStart == numberEnd) {
weekNumber = numberStart.ToString();
} else {
weekNumber = numberStart.ToString() + " / " + numberEnd.ToString();
}
pe.Graphics.DrawString(weekNumber, Scheduler.Appearance.HeaderCaption.Font, Brushes.Black, monthRect, sf);
}
}
}
class RectParameters {
public int Y { get; set; }
public int Height { get; set; }
}
}