甘特图C#实现

1.新建用户控件;解决方案=》项目右键单击=》新建用户控件,把下面的代码拷贝进去

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
/// <summary> 
    /// 甘特图控件 
    /// </summary> 
    public class ProjectViewBox : DevExpress.XtraEditors.XtraUserControl
    {
        #region 容器
        #region 设计器代码
        /// <summary>  
        /// 必需的设计器变量。 
        /// </summary> 
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>  
        /// 清理所有正在使用的资源。 
        /// </summary> 
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region 组件设计器生成的代码
 
        /// <summary>  
        /// 设计器支持所需的方法 - 不要 
        /// 使用代码编辑器修改此方法的内容。 
        /// </summary> 
        private void InitializeComponent()
        {
            this.hScrollBar1 = new System.Windows.Forms.HScrollBar();
            this.vScrollBar1 = new System.Windows.Forms.VScrollBar();
            this.MainPictureBox = new System.Windows.Forms.PictureBox();
            ((System.ComponentModel.ISupportInitialize)(this.MainPictureBox)).BeginInit();
            this.SuspendLayout();
            //
            // hScrollBar1
            //
            this.hScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));
            this.hScrollBar1.LargeChange = 1;
            this.hScrollBar1.Location = new System.Drawing.Point(1, 111);
            this.hScrollBar1.Maximum = 60;
            this.hScrollBar1.Name = "hScrollBar1";
            this.hScrollBar1.Size = new System.Drawing.Size(120, 16);
            this.hScrollBar1.TabIndex = 0;
            //
            // vScrollBar1
            //
            this.vScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
            | System.Windows.Forms.AnchorStyles.Right)));
            this.vScrollBar1.LargeChange = 1;
            this.vScrollBar1.Location = new System.Drawing.Point(121, 0);
            this.vScrollBar1.Maximum = 60;
            this.vScrollBar1.Name = "vScrollBar1";
            this.vScrollBar1.Size = new System.Drawing.Size(16, 111);
            this.vScrollBar1.TabIndex = 1;
            //
            // MainPictureBox
            //
            this.MainPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
            | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));
            this.MainPictureBox.Location = new System.Drawing.Point(0, 0);
            this.MainPictureBox.Name = "MainPictureBox";
            this.MainPictureBox.Size = new System.Drawing.Size(316, 328);
            this.MainPictureBox.TabIndex = 2;
            this.MainPictureBox.TabStop = false;
            //
            // ProjectViewBox
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackColor = System.Drawing.SystemColors.Control;
            this.Controls.Add(this.vScrollBar1);
            this.Controls.Add(this.hScrollBar1);
            this.Controls.Add(this.MainPictureBox);
            this.Name = "ProjectViewBox";
            this.Size = new System.Drawing.Size(139, 129);
            this.Load += new System.EventHandler(this.ProjectBox_Load);
            this.SizeChanged += new System.EventHandler(this.ProjectBox_SizeChanged);
            ((System.ComponentModel.ISupportInitialize)(this.MainPictureBox)).EndInit();
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private System.Windows.Forms.HScrollBar hScrollBar1;
        private System.Windows.Forms.VScrollBar vScrollBar1;
        private System.Windows.Forms.PictureBox MainPictureBox;
        #endregion
 
        public ProjectViewBox()
        {
            InitializeComponent();
        }
 
        #region 私有成员
        /// <summary> 
        /// 最小单元格 
        /// </summary> 
        private int m_Size = 20;
        private int mh_Size = 20;
        /// <summary> 
        /// 日期索引 记录当前绘制的位置 
        /// </summary> 
        private int m_DayIndex = 0;//提起索引的添加,重点
        /// <summary> 
        /// 开始绘制位置 
        /// </summary> 
        private int m_JobIndex = 0;
        #endregion
 
        /// <summary> 
        /// 大小改变 
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void ProjectBox_SizeChanged(object sender, EventArgs e)
        {
            if (MainPictureBox.Image != null) PaintProjectImage();
        }
 
        private MyScroll Hscroll;
        private MyScroll Vscroll;
 
        private void ProjectBox_Load(object sender, EventArgs e)
        {
            MainPictureBox.Image = new Bitmap(1, 1);
            PaintProjectImage();
            Hscroll = new MyScroll();
            Hscroll.Click += new MyScroll.ScrollClick(Hscroll_Click);
            Hscroll.AssignHandle(hScrollBar1.Handle);
 
            Vscroll = new MyScroll();
            Vscroll.Click += new MyScroll.ScrollClick(Vscroll_Click);
            Vscroll.AssignHandle(vScrollBar1.Handle);
 
            m_ProjectSelect.ProjectBox = this;
        }
 
        #region 滚动条
        void Vscroll_Click(int p_Value)
        {
            switch (p_Value)
            {
                case 0:
                    m_JobIndex = vScrollBar1.Value;
                    break;
                case 1:
                    m_JobIndex--;
                    if (m_JobIndex < 0) m_JobIndex = 0;
                    break;
                case 2:
                    m_JobIndex++;
                    break;
 
            }
            if (m_JobIndex <= 0) vScrollBar1.Value = 0;
            if (m_JobIndex >= 60) vScrollBar1.Value = 60;
            PaintProjectImage();
        }
 
        void Hscroll_Click(int p_Value)
        {
            switch (p_Value)
            {
                case 0:
                    m_DayIndex = hScrollBar1.Value;
                    break;
                case 1:
                    m_DayIndex--;
                    break;
                case 2:
                    m_DayIndex++;
                    break;
 
            }
            if (m_DayIndex <= 0) hScrollBar1.Value = 0;
            if (m_DayIndex >= 60) hScrollBar1.Value = 60;
            PaintProjectImage();
        }
        #endregion
 
        /// <summary> 
        /// 刷新 
        /// </summary> 
        public override void Refresh()
        {
            PaintProjectImage();
        }
 
        /// <summary> 
        /// 开始绘制 
        /// </summary> 
        private void PaintProjectImage()
        {
            MainPictureBox.Image.Dispose();
            if (MainPictureBox.Width == 0 || MainPictureBox.Height == 0) return;
            Bitmap _NewBitmap = new Bitmap(MainPictureBox.Width, MainPictureBox.Height);
            Graphics _Graphics = Graphics.FromImage(_NewBitmap);
            Point _DrawPoint = new Point(0, 0);
            DateTime _DrawDate = DateTime.Now.AddDays(m_DayIndex);//日期表头的定义
            while (true)
            {
                _DrawPoint = GraphicsWeekHead(_Graphics, ref _DrawDate, _DrawPoint);
 
                if (_DrawPoint.X > MainPictureBox.Width) break;
            }
 
            DateTime _NodeStarDate = DateTime.Now.AddDays(m_DayIndex);
            int _Hight = m_Size * 2;
            for (int i = m_JobIndex; i < m_ProjectSelect.Count; i++)
            {
                m_ProjectSelect[i].GraphisDraw(_Graphics, _NodeStarDate, m_Size, ref _Hight, MainPictureBox.Width, MainPictureBox.Height);
            }
 
            MainPictureBox.Image = _NewBitmap;
        }
 
        /// <summary> 
        /// 绘制日期头和星期几 
        /// </summary> 
        /// <param name="p_Graphics">刷子</param> 
        /// <param name="p_StarDate">开始日期 ref类型 返回日期的下周一</param> 
        /// <param name="p_StarPoint">开始位置</param> 
        /// <returns>结束节点</returns> 
        private Point GraphicsWeekHead(Graphics p_Graphics, ref DateTime p_StarDate, Point p_StarPoint)
        {
            int _Date = (int)p_StarDate.DayOfWeek;
            if (_Date != 0) p_StarDate = p_StarDate.AddDays(-_Date);
            int _DrawDateX = p_StarPoint.X - (_Date * mh_Size);
            Pen _LinePen = new Pen(Brushes.Black, 1);
            Rectangle _RectangleHead = new Rectangle(_DrawDateX, 0, mh_Size * 7, mh_Size);
            StringFormat _StringFormat = new StringFormat();
            _StringFormat.LineAlignment = StringAlignment.Far;
 
            p_Graphics.DrawRectangle(_LinePen, _RectangleHead);
            p_Graphics.DrawString(p_StarDate.ToString("yyyy年MM月dd日"), this.Font, Brushes.Black, _RectangleHead, _StringFormat);
 
            _RectangleHead = new Rectangle(p_StarPoint.X, mh_Size, p_StarPoint.X + mh_Size, mh_Size);
            Rectangle _BlackRect = new Rectangle(0, mh_Size * 2, mh_Size, this.Height - (mh_Size * 2));
 
            Color _BlackColor = m_ProjectSelect.BackColor;
 
            for (int i = _Date; i != 7; i++)
            {
                string _WeekText = string.Empty;
                switch (i)
                {
                    case 0:
                        _WeekText = "日";
                        _BlackColor = m_ProjectSelect.WeekBackColor;
                        break;
                    case 1:
                        _WeekText = "一";
                        _BlackColor = m_ProjectSelect.BackColor;
                        break;
                    case 2:
                        _WeekText = "二";
                        _BlackColor = m_ProjectSelect.BackColor;
                        break;
                    case 3:
                        _WeekText = "三";
                        _BlackColor = m_ProjectSelect.BackColor;
                        break;
                    case 4:
                        _WeekText = "四";
                        _BlackColor = m_ProjectSelect.BackColor;
                        break;
                    case 5:
                        _WeekText = "五";
                        _BlackColor = m_ProjectSelect.BackColor;
                        break;
                    case 6:
                        _WeekText = "六";
                        _BlackColor = m_ProjectSelect.WeekBackColor;
                        break;
                }
                HatchBrush _BlackBrush = new HatchBrush(HatchStyle.Percent50, _BlackColor, Color.White);
                _BlackRect.X = _RectangleHead.X;
                p_Graphics.FillRectangle(_BlackBrush, _BlackRect);
 
                p_Graphics.DrawRectangle(_LinePen, _RectangleHead);
                p_Graphics.DrawString(_WeekText, new Font("宋体", 8.0f), GetWorkColumneColor(p_StarDate, i), _RectangleHead, _StringFormat);
                _RectangleHead.X += mh_Size;
            }
            p_StarDate = p_StarDate.AddDays(7);
            return new Point(_RectangleHead.X, mh_Size * 2);
        }
 
        /// <summary> 
        /// 获取日期的标题色 
        /// </summary> 
        /// <param name="p_Date">日期</param> 
        /// <param name="p_Day">1-7</param> 
        /// <returns></returns> 
        public SolidBrush GetWorkColumneColor(DateTime p_Date, int p_Day)
        {
            DateTime _ValueDate = p_Date.AddDays(p_Day);
 
            if (_ValueDate.DayOfWeek == DayOfWeek.Saturday && !m_ProjectSelect.SaturdayOfWork)
            {
                return new SolidBrush(m_ProjectSelect.ColumnHolidayColor);
            }
            if (_ValueDate.DayOfWeek == DayOfWeek.Sunday && !m_ProjectSelect.SundayOfWork)
            {
                return new SolidBrush(m_ProjectSelect.ColumnHolidayColor);
            }
 
            for (int z = 0; z != m_ProjectSelect.HolidayList.Count; z++)
            {
                bool _Year = m_ProjectSelect.HolidayList[z].Year == _ValueDate.Year;
                bool _Month = m_ProjectSelect.HolidayList[z].Month == _ValueDate.Month;
                bool _Day = m_ProjectSelect.HolidayList[z].Day == _ValueDate.Day;
 
                if (_Year && _Month && _Day)
                {
                    return new SolidBrush(m_ProjectSelect.ColumnHolidayColor);
                }
            }
 
            return new SolidBrush(m_ProjectSelect.ColumnWorkDayColor);
        }
 
        #region 公用属性
        private ProjectSelect m_ProjectSelect = new ProjectSelect();
        /// <summary> 
        /// 基本设置 
        /// </summary>      
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public ProjectSelect ProjectSelectData
        {
            get { return m_ProjectSelect; }
            set { m_ProjectSelect = value; m_ProjectSelect.ProjectBox = this; }
        }
        #endregion
 
        /// <summary> 
        /// 实在写不好Scroll 判断消息
        /// </summary> 
        private class MyScroll : NativeWindow
        {
            public delegate void ScrollClick(int p_Value);
            public event ScrollClick Click;
 
            protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                int _ClickType = -1;
                switch (m.Msg)
                {
                    case 0xEa:
                        _ClickType = 0;
                        break;
                    case 0x2114:
                        switch (m.WParam.ToInt32())
                        {
                            case 0:
                                _ClickType = 1;
                                break;
                            case 1:
                                _ClickType = 2;
                                break;
                            case 3:
                                _ClickType = 0;
                                break;
                            case 2:
                                _ClickType = 0;
                                break;
                        }
                        break;
                    case 0x2115:
                        switch (m.WParam.ToInt32())
                        {
                            case 0:
                                _ClickType = 1;
                                break;
                            case 1:
                                _ClickType = 2;
                                break;
                            case 3:
                                _ClickType = 0;
                                break;
                            case 2:
                                _ClickType = 0;
                                break;
                        }
                        break;
                    default:
                        break;
                }
                if (Click != null && _ClickType != -1) Click(_ClickType);
 
            }
        }
        #endregion
 
        /// <summary> 
        /// 数据类 
        /// </summary> 
        [Serializable]
        public class ProjectSelect
        {
            private IList<DateTime> m_HolidayList = new List<DateTime>();
            private bool m_SundayOfWork = true;
            private bool m_SaturdayOfWork = true;
            private ProjectViewBox m_ProjectBox;
            private Color m_BackColor = Color.White;
            private Color m_WeekBackColor = Color.FromArgb(200, 200, 200, 200);
            private IList<ProjectNode> m_Nodes = new List<ProjectNode>();
            private Color m_ColumnWorkDayColor = Color.Black;
            private Color m_ColumnHolidayColor = Color.Red;
 
 
            public ProjectNode this[int p_Index]
            {
                get
                {
                    return m_Nodes[p_Index];
                }
            }
 
            /// <summary> 
            /// 工作日背景颜色 
            /// </summary> 
            public Color BackColor { get { return m_BackColor; } set { m_BackColor = value; } }
            /// <summary> 
            /// 假期颜色 
            /// </summary> 
            public Color WeekBackColor { get { return m_WeekBackColor; } set { m_WeekBackColor = value; } }
            /// <summary> 
            /// 星期六是否工作 false为放假 
            /// </summary> 
            public bool SaturdayOfWork { get { return m_SaturdayOfWork; } set { m_SaturdayOfWork = value; } }
            /// <summary> 
            /// 星期日是否工作 false为放假 
            /// </summary> 
            public bool SundayOfWork { get { return m_SundayOfWork; } set { m_SundayOfWork = value; } }
            /// <summary> 
            /// 假期设置 
            /// </summary> 
            public IList<DateTime> HolidayList { get { return m_HolidayList; } set { m_HolidayList = value; } }
            /// <summary> 
            /// 该设置的显示控件 
            /// </summary> 
            public ProjectViewBox ProjectBox { get { return m_ProjectBox; } set { m_ProjectBox = value; } }
            /// <summary> 
            /// 数量 
            /// </summary> 
            public int Count { get { return m_Nodes.Count; } }
            /// <summary> 
            /// 假期颜色(标题) 
            /// </summary> 
            public Color ColumnHolidayColor { get { return m_ColumnHolidayColor; } set { m_ColumnHolidayColor = value; } }
            /// <summary> 
            /// 工作日颜色(标题) 
            /// </summary> 
            public Color ColumnWorkDayColor { get { return m_ColumnWorkDayColor; } set { m_ColumnWorkDayColor = value; } }
 
 
            /// <summary> 
            /// 添加 
            /// </summary> 
            /// <param name="p_NodeList">内容</param> 
            public void Add(ProjectNode p_NodeList)
            {
                p_NodeList.ProjectSelect = this;
                m_Nodes.Add(p_NodeList);
                Refresh();
            }
            /// <summary> 
            /// 清除 
            /// </summary> 
            public void Clear()
            {
                m_Nodes.Clear();
                Refresh();
            }
            /// <summary> 
            /// 插入 
            /// </summary> 
            /// <param name="p_Index"></param> 
            /// <param name="p_NodeList"></param> 
            public void Insert(int p_Index, ProjectNode p_NodeList)
            {
                m_Nodes.Insert(p_Index, p_NodeList);
                Refresh();
            }
            /// <summary> 
            /// 删除 
            /// </summary> 
            /// <param name="p_Index"></param> 
            public void RemoveAt(int p_Index)
            {
                m_Nodes.RemoveAt(p_Index);
                Refresh();
            }
            /// <summary> 
            /// 删除 
            /// </summary> 
            /// <param name="p_NodeList"></param> 
            public void Remove(ProjectNode p_NodeList)
            {
                m_Nodes.Remove(p_NodeList);
                Refresh();
            }
            /// <summary> 
            /// 刷新 
            /// </summary> 
            public void Refresh()
            {
                m_ProjectBox.Refresh();
            }
 
 
        }
 
        /// <summary> 
        /// 节点类 
        /// </summary> 
        [Serializable]
        public class ProjectNode //注意Nodes
        {
            private string m_JobName = string.Empty;
            private sbyte m_Complete = -1;
            private DateTime m_StartDate = DateTime.Now;
            private uint m_WorkDay = 0;
            private HatchStyle m_Style = HatchStyle.Percent50;
            private Color m_Color = Color.Blue;
            private ProjectSelect m_ProjectSelect;
 
            public ProjectNode(DateTime p_StarTime, uint p_WorkDay)
            {
                m_StartDate = p_StarTime;
                m_WorkDay = p_WorkDay;
            }
 
            public ProjectNode(DateTime p_StarTime, uint p_WorkDay, string p_JobName)
            {
                m_StartDate = p_StarTime;
                m_WorkDay = p_WorkDay;
                m_JobName = p_JobName;
            }
 
            /// <summary> 
            /// 节点设置 
            /// </summary> 
            public ProjectSelect ProjectSelect
            {
                get { return m_ProjectSelect; }
                set { m_ProjectSelect = value; }
            }
            /// <summary> 
            /// 显示样式 
            /// </summary> 
            public HatchStyle Style { get { return m_Style; } set { m_Style = value; Refresh(); } }
            /// <summary> 
            /// 显示颜色 
            /// </summary> 
            public Color Color { get { return m_Color; } set { m_Color = value; Refresh(); } }
            /// <summary> 
            /// 任务名称 
            /// </summary> 
            public string JobName { get { return m_JobName; } set { m_JobName = value; Refresh(); } }
            /// <summary> 
            /// 任务开始日期 
            /// </summary> 
            public DateTime StartDate { get { return m_StartDate; } set { m_StartDate = value; Refresh(); } }
            /// <summary> 
            /// 工作天数 
            /// </summary> 
            public uint WorkDay { get { return m_WorkDay; } set { m_WorkDay = value; Refresh(); } }
            /// <summary> 
            /// 资源名称/工程进度 
            /// </summary> 
            public sbyte Complete { get { return m_Complete; } set { m_Complete = value; } }
 
            /// <summary> 
            /// 根据开始时间获取显示的区域 
            /// </summary> 
            /// <param name="p_StarDate"></param> 
            /// <param name="p_DrawSize"></param> 
            /// <param name="p_Height"></param> 
            /// <returns></returns> 
            public Rectangle GetRectangle(DateTime p_StarDate, int p_DrawSize, int p_Height)
            {
                DateTime _TimeStar = StartDate;
                GetWorkDay(ref _TimeStar);
                TimeSpan _Span = _TimeStar - p_StarDate;
                int _Day = 0;
                if (_Span.Days >= 0)
                {
                    _Day = (int)(_Span.TotalDays + 0.999999999999999);
                }
                else
                {
                    _Day = (int)_Span.TotalDays;
                }
 
                int _Width = _Day * p_DrawSize;
                int _WorkDay = (int)WorkDay;
 
                GetWorkDayCount(_TimeStar, ref _WorkDay);
                return new Rectangle(_Width, p_Height, _WorkDay * p_DrawSize, p_DrawSize);
            }
 
            /*/
            public Rectangle GetRectangle1(DateTime p_StarDate, int p_DrawSize, int p_Height)
            {
                DateTime _TimeStar = StartDate;
                GetWorkDay(ref _TimeStar);
                TimeSpan _Span = _TimeStar - p_StarDate;
                int _Day = 0;
                if (_Span.Days >= 0)
                {
                    _Day = (int)(_Span.TotalDays + 0.999999999999999);
                }
                else
                {
                    _Day = (int)_Span.TotalDays;
                }
 
                int _Width = _Day * p_DrawSize;
                int _WorkDay = (int)WorkDay;
 
                GetWorkDayCount(_TimeStar, ref _WorkDay);
                return new Rectangle(_Width, p_Height, _WorkDay * p_DrawSize, p_DrawSize);
            }
            /*/
            public void GraphisDraw(Graphics p_Graphics, DateTime p_StarDate, int p_DrawSize, ref int p_Height, int p_MaxWidth, int p_MaxHeight)
            {
                if (p_Height > p_MaxHeight) return;
                Rectangle _Rectangle = GetRectangle(p_StarDate, p_DrawSize, p_Height);
                if (_Rectangle.X > p_MaxWidth) return;
                _Rectangle.Y += 4;
                _Rectangle.Height -= 8;
                HatchBrush _BlackBrush = new HatchBrush(m_Style, m_Color, Color.White);
                p_Graphics.FillRectangle(_BlackBrush, _Rectangle);
                p_Graphics.DrawRectangle(new Pen(Brushes.Black, 1), _Rectangle);
                if (m_Complete >= 0)
                {
                    StringFormat _StringFormt = new StringFormat();
                    _StringFormt.Alignment = StringAlignment.Center;
                    _StringFormt.LineAlignment = StringAlignment.Center;
                    p_Graphics.DrawString(m_Complete.ToString() + "%", new Font("微软雅黑", 12, FontStyle.Bold), Brushes.Black, _Rectangle, _StringFormt);
                }
                p_Graphics.DrawString(m_JobName, new Font("微软雅黑", 9), Brushes.Black, _Rectangle.X + _Rectangle.Width, _Rectangle.Y + 1);
                p_Height += p_DrawSize;
            }
 
            /// <summary> 
            /// 刷新 
            /// </summary> 
            private void Refresh()
            {
                if (m_ProjectSelect != null) m_ProjectSelect.Refresh();
            }
 
            /// <summary> 
            /// 获取工作结束日期 
            /// </summary> 
            private void GetWorkDayCount(DateTime p_StarTime, ref int p_WorkDay)
            {
                DateTime _StarTime = p_StarTime;
                for (int i = 0; i != p_WorkDay; i++)
                {
                    _StarTime = p_StarTime.AddDays(i);
                    /*if (_StarTime.DayOfWeek == DayOfWeek.Saturday && !m_ProjectSelect.SaturdayOfWork)
                    {
                        p_WorkDay++;
                        continue;
                    }
                    if (_StarTime.DayOfWeek == DayOfWeek.Sunday && !m_ProjectSelect.SundayOfWork)
                    {
                        p_WorkDay++;
                        continue;
                    }*/
 
                    for (int z = 0; z != m_ProjectSelect.HolidayList.Count; z++)
                    {
                        bool _Year = m_ProjectSelect.HolidayList[z].Year == _StarTime.Year;
                        bool _Month = m_ProjectSelect.HolidayList[z].Month == _StarTime.Month;
                        bool _Day = m_ProjectSelect.HolidayList[z].Day == _StarTime.Day;
 
                        if (_Year && _Month && _Day)
                        {
                            p_WorkDay++;
                            break;
                        }
                    }
                }
            }
 
            /// <summary> 
            /// 获取开始日期 
            /// </summary> 
            /// <param name="p_Value">数据</param> 
            /// <returns>日期</returns> 
            private void GetWorkDay(ref DateTime p_Value)
            {
                bool _Set = false;
                //if (p_Value.DayOfWeek == DayOfWeek.Saturday && !m_ProjectSelect.SaturdayOfWork) p_Value = p_Value.AddDays(1);
                //if (p_Value.DayOfWeek == DayOfWeek.Sunday && !m_ProjectSelect.SundayOfWork) p_Value = p_Value.AddDays(1);
 
                for (int i = 0; i != m_ProjectSelect.HolidayList.Count; i++)
                {
                    bool _Year = m_ProjectSelect.HolidayList[i].Year == p_Value.Year;
                    bool _Month = m_ProjectSelect.HolidayList[i].Month == p_Value.Month;
                    bool _Day = m_ProjectSelect.HolidayList[i].Day == p_Value.Day;
 
                    if (_Year && _Month && _Day)
                    {
                        p_Value = p_Value.AddDays(1);
                        _Set = true;
                        break;
                    }
                }
                if (_Set) GetWorkDay(ref p_Value);
            }
        }
    

 2.在左边工具栏中把新建好的控件拖拽进去Form,然后添加代码显示,下面是样例代码:

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
#region 加载横道图
            AutoScroll = true;
            /*
            int[] day = new int[dataGridView1.Rows.Count];
            string[] fromtime = new string[dataGridView1.Rows.Count];
            string[] _Node = new string[dataGridView1.Rows.Count];
            */
            //test
            int DT = new int();
            DT = dtTree.Rows.Count;
 
            string[,] data = new string[DT, 4];
            DateTime st = new DateTime();
            DateTime ft = new DateTime();
            TimeSpan ts = new TimeSpan();
            for (int i = 0; i < DT; i++)
            {
                data[i, 0] = dtTree.Rows[i][1].ToString();
                data[i, 1] = dtTree.Rows[i][3].ToString();
                data[i, 2] = dtTree.Rows[i][4].ToString();
                DateTime.TryParse(data[i, 1], out st);
                DateTime.TryParse(data[i, 2], out ft);
                ts = ft - st;
                data[i, 3] = ts.Days.ToString();
 
                string startDay = data[i, 1];
                DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
                dtFormat.ShortDatePattern = "yyyy/MM/dd";
                DateTime dt = Convert.ToDateTime(startDay, dtFormat);
                string nameStr = data[i, 0];
                int days = Convert.ToInt32(data[i, 3]);
                ProjectViewBox.ProjectNode _Nodei = new ProjectViewBox.ProjectNode(dt, (uint)days, nameStr);
                projectViewBox1.ProjectSelectData.Add(_Nodei);
            }
            #endregion

  个人测试成功,有问题可以留言或者联系邮箱ruanyangzhi@126.com

 

posted @   学知行者  阅读(3609)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示