using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace GanttChart { /// /// 甘特图控件 /// [ToolboxBitmap(typeof(GanttChartView), "GanttChart.GanttChartView.bmp")] public partial class GanttChartView: Control { #region Private Members private HScrollBar _HScrollBar; private VScrollBar _VScrollBar; private TableLayoutPanel _Table; private Control _ContentControl; private GanttChartBrushes Brushes; #endregion #region ctor public GanttChartView() { _Table = new TableLayoutPanel(); _Table.ColumnCount = 2; _Table.RowCount = 2; _Table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); _Table.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, VScrollWidth)); _Table.RowStyles.Add(new RowStyle(SizeType.AutoSize)); _Table.RowStyles.Add(new RowStyle(SizeType.Absolute, HScrollHeight)); _ContentControl = new GanttChartCanvas(); _ContentControl.Dock = DockStyle.Fill; _ContentControl.Margin = new Padding(0); _Table.Controls.Add(_ContentControl, 0, 0); _HScrollBar = new HScrollBar(); _HScrollBar.Value = 0; _HScrollBar.Height = HScrollHeight; _HScrollBar.SmallChange = 1; _HScrollBar.LargeChange = 2; //_HScrollBar.Dock = DockStyle.Fill; _HScrollBar.Visible = true; _Table.Controls.Add(_HScrollBar, 0, 1); _VScrollBar = new VScrollBar(); _VScrollBar.Value = 0; _VScrollBar.Width = VScrollWidth; _VScrollBar.SmallChange = 1; _VScrollBar.LargeChange = 2; //_VScrollBar.Dock = DockStyle.Fill; _VScrollBar.Visible = true; _Table.Controls.Add(_VScrollBar, 1, 0); _Table.Dock = DockStyle.Fill; Controls.Add(_Table); InitEvent(); } #endregion /// /// 调整滚动条 /// private void AdjustScrollbar() { var bottom = ItemHeight + RowSpacing * 2; if (Rows != null && Rows.Any()) { if (StartDate != Rows.StartDate || Rows.IsChanged) { ComputeRowsAndItemsSize(); Rows.IsChanged = false; Rows.StartDate = StartDate; } var last = Rows.Last(); bottom = last.Bottom; } if (IsFixedRowHeight) { var h = ColumnHeight + (Rows?.Count ?? 0) * RowHeight + 200; if(h > Height - HScrollHeight) { _VScrollBar.Maximum = h - Height + HScrollHeight + 1; } else { _VScrollBar.Maximum = 0; } } else { _VScrollBar.Maximum = bottom - Height + HScrollHeight + 1 + 200; } _VScrollBar.Minimum = 0; _HScrollBar.Maximum = ((int)(EndDate.Date - StartDate.Date).TotalDays + 1) * DateWidth - Width + RowHeaderWidth + VScrollWidth + 1 + 200; _HScrollBar.Minimum = 0; _VScrollBar.Enabled = _VScrollBar.Maximum > 0; _HScrollBar.Enabled = _HScrollBar.Maximum > 0; } /// /// 重绘 /// public new void Invalidate() { base.Invalidate(); _ContentControl.Invalidate(); } /// /// 销毁 /// /// protected override void Dispose(bool disposing) { this.Brushes?.Dispose(); base.Dispose(disposing); } class GanttChartCanvas : Control { public GanttChartCanvas() { SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.Selectable, true); } protected override void OnPaintBackground(PaintEventArgs pevent) { } } } }