天天看點

C#制作甘特圖

     先自制甘特圖控件:

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

using System.ComponentModel;

namespace GanttControls

{

    /// <summary>  

    /// 甘特圖控件  

    /// [email protected]  

    /// qq:116149  

    /// </summary>  

    public class ProjectViewBox : UserControl

    {

        #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(120, 109);

            this.MainPictureBox.TabIndex = 2;

            this.MainPictureBox.TabStop = false;

            //   

            // ProjectBox  

            //   

            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 = "ProjectBox";

            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 = 18;

        /// <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 * m_Size);

            Pen _LinePen = new Pen(Brushes.Black, 1);

            Rectangle _RectangleHead = new Rectangle(_DrawDateX, 0, m_Size * 7, m_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, m_Size, p_StarPoint.X + m_Size, m_Size);

            Rectangle _BlackRect = new Rectangle(0, m_Size * 2, m_Size, this.Height - (m_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("宋體", 9.0f), GetWorkColumneColor(p_StarDate, i), _RectangleHead, _StringFormat);

                _RectangleHead.X += m_Size;

            }

            p_StarDate = p_StarDate.AddDays(7);

            return new Point(_RectangleHead.X, m_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 = false;

            private bool m_SaturdayOfWork = false;

            private ProjectViewBox m_ProjectBox;

            private Color m_BackColor = Color.White;

            private Color m_WeekBackColor = Color.FromArgb(255, 212, 208, 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

        {

            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 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 += 5;

                _Rectangle.Height -= 5;

                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);

            }

        }

    }

}

前端:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace GanttControls

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            GanttControls.ProjectViewBox.ProjectNode p1 =new ProjectViewBox.ProjectNode(DateTime.Parse("2012-04-12"), 2, "新任務1");

            GanttControls.ProjectViewBox.ProjectNode p2 = new ProjectViewBox.ProjectNode(DateTime.Parse("2012-04-13"), 3, "新任務2");

            GanttControls.ProjectViewBox.ProjectNode p3 = new ProjectViewBox.ProjectNode(DateTime.Parse("2012-04-13"), 2, "新任務3");

            GanttControls.ProjectViewBox.ProjectNode p4 = new ProjectViewBox.ProjectNode(DateTime.Parse("2012-04-14"), 5, "新任務2");

            GanttControls.ProjectViewBox.ProjectNode p5 = new ProjectViewBox.ProjectNode(DateTime.Parse("2012-04-15"), 8, "新任務3");

            p1.Complete = 10;

            p2.Complete = 80;

            p3.Complete = 60;

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2012-04-01"));

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2012-04-12"));

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2012-04-14"));

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2012-04-15"));

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2012-04-16"));

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2012-04-17"));

            projectViewBox1.ProjectSelectData.Add(p1);

            projectViewBox1.ProjectSelectData.Add(p2);

            projectViewBox1.ProjectSelectData.Add(p3);

            projectViewBox1.ProjectSelectData.Add(p4);

            projectViewBox1.ProjectSelectData.Add(p5);

        }

    }

}

轉載于:https://www.cnblogs.com/Mayvar/archive/2012/04/12/wanghonghua_201204120938.html