实例介绍
【实例简介】.NET C# Winforms Gantt Chart Control
【实例截图】
【核心代码】
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 Braincase.GanttChart
{
/// <summary>
/// An elaborate example on how the chart control might be used.
/// Start by collapsing all regions and then read the constructor.
/// Refer to IProjectManager interface for method description.
/// </summary>
public partial class ExampleFull : Form
{
OverlayPainter _mOverlay = new OverlayPainter();
ProjectManager _mManager = null;
/// <summary>
/// Example starts here
/// </summary>
public ExampleFull()
{
InitializeComponent();
// Create a Project and some Tasks
_mManager = new ProjectManager();
var work = new MyTask(_mManager) { Name = "Prepare for Work" };
var wake = new MyTask(_mManager) { Name = "Wake Up" };
var teeth = new MyTask(_mManager) { Name = "Brush Teeth" };
var shower = new MyTask(_mManager) { Name = "Shower" };
var clothes = new MyTask(_mManager) { Name = "Change into New Clothes" };
var hair = new MyTask(_mManager) { Name = "Blow My Hair" };
var pack = new MyTask(_mManager) { Name = "Pack the Suitcase" };
_mManager.Add(work);
_mManager.Add(wake);
_mManager.Add(teeth);
_mManager.Add(shower);
_mManager.Add(clothes);
_mManager.Add(hair);
_mManager.Add(pack);
// Create another 1000 tasks for stress testing
Random rand = new Random();
for (int i = 0; i < 1000; i )
{
var task = new MyTask(_mManager) { Name = string.Format("New Task {0}", i.ToString()) };
_mManager.Add(task);
_mManager.SetStart(task, rand.Next(300));
_mManager.SetDuration(task, rand.Next(50));
}
// Set task durations, e.g. using ProjectManager methods
_mManager.SetDuration(wake, 3);
_mManager.SetDuration(teeth, 5);
_mManager.SetDuration(shower, 7);
_mManager.SetDuration(clothes, 4);
_mManager.SetDuration(hair, 3);
_mManager.SetDuration(pack, 5);
// demostrate splitting a task
_mManager.Split(pack, new MyTask(_mManager), new MyTask(_mManager), 2);
// Set task complete status, e.g. using newly created properties
wake.Complete = 0.9f;
teeth.Complete = 0.5f;
shower.Complete = 0.4f;
// Give the Tasks some organisation, setting group and precedents
_mManager.Group(work, wake);
_mManager.Group(work, teeth);
_mManager.Group(work, shower);
_mManager.Group(work, clothes);
_mManager.Group(work, hair);
_mManager.Group(work, pack);
_mManager.Relate(wake, teeth);
_mManager.Relate(wake, shower);
_mManager.Relate(shower, clothes);
_mManager.Relate(shower, hair);
_mManager.Relate(hair, pack);
_mManager.Relate(clothes, pack);
// Create and assign Resources.
// MyResource is just custom user class. The API can accept any object as resource.
var jake = new MyResource() { Name = "Jake" };
var peter = new MyResource() { Name = "Peter" };
var john = new MyResource() { Name = "John" };
var lucas = new MyResource() { Name = "Lucas" };
var james = new MyResource() { Name = "James" };
var mary = new MyResource() { Name = "Mary" };
// Add some resources
_mManager.Assign(wake, jake);
_mManager.Assign(wake, peter);
_mManager.Assign(wake, john);
_mManager.Assign(teeth, jake);
_mManager.Assign(teeth, james);
_mManager.Assign(pack, james);
_mManager.Assign(pack, lucas);
_mManager.Assign(shower, mary);
_mManager.Assign(shower, lucas);
_mManager.Assign(shower, john);
// Initialize the Chart with our ProjectManager and CreateTaskDelegate
_mChart.Init(_mManager);
_mChart.CreateTaskDelegate = delegate() { return new MyTask(_mManager); };
// Attach event listeners for events we are interested in
_mChart.TaskMouseOver = new EventHandler<TaskMouseEventArgs>(_mChart_TaskMouseOver);
_mChart.TaskMouseOut = new EventHandler<TaskMouseEventArgs>(_mChart_TaskMouseOut);
_mChart.TaskSelected = new EventHandler<TaskMouseEventArgs>(_mChart_TaskSelected);
_mChart.PaintOverlay = _mOverlay.ChartOverlayPainter;
_mChart.AllowTaskDragDrop = true;
// set some tooltips to show the resources in each task
_mChart.SetToolTip(wake, string.Join(", ", _mManager.ResourcesOf(wake).Select(x => (x as MyResource).Name)));
_mChart.SetToolTip(teeth, string.Join(", ", _mManager.ResourcesOf(teeth).Select(x => (x as MyResource).Name)));
_mChart.SetToolTip(pack, string.Join(", ", _mManager.ResourcesOf(pack).Select(x => (x as MyResource).Name)));
_mChart.SetToolTip(shower, string.Join(", ", _mManager.ResourcesOf(shower).Select(x => (x as MyResource).Name)));
// Set Time information
_mManager.TimeScale = TimeScale.Day;
var span = DateTime.Today - _mManager.Start;
_mManager.Now = (int)Math.Round(span.TotalDays); // set the "Now" marker at the correct date
_mChart.TimeScaleDisplay = TimeScaleDisplay.DayOfWeek; // Set the chart to display days of week in header
// Init the rest of the UI
_InitExampleUI();
}
void _mChart_TaskSelected(object sender, TaskMouseEventArgs e)
{
_mTaskGrid.SelectedObjects = _mChart.SelectedTasks.Select(x => _mManager.IsPart(x) ? _mManager.SplitTaskOf(x) : x).ToArray();
_mResourceGrid.Items.Clear();
_mResourceGrid.Items.AddRange(_mManager.ResourcesOf(e.Task).Select(x => new ListViewItem(((MyResource)x).Name)).ToArray());
}
void _mChart_TaskMouseOut(object sender, TaskMouseEventArgs e)
{
lblStatus.Text = "";
_mChart.Invalidate();
}
void _mChart_TaskMouseOver(object sender, TaskMouseEventArgs e)
{
lblStatus.Text = string.Format("{0} to {1}", _mManager.GetDateTime(e.Task.Start).ToLongDateString(), _mManager.GetDateTime(e.Task.End).ToLongDateString());
_mChart.Invalidate();
}
private void _InitExampleUI()
{
TaskGridView.DataSource = new BindingSource(_mManager.Tasks, null);
mnuFilePrint200.Click = (s, e) => _PrintDocument(2.0f);
mnuFilePrint150.Click = (s, e) => _PrintDocument(1.5f);
mnuFilePrint100.Click = (s, e) => _PrintDocument(1.0f);
mnuFilePrint80.Click = (s, e) => _PrintDocument(0.8f);
mnuFilePrint50.Click = (s, e) => _PrintDocument(0.5f);
mnuFilePrint25.Click = (s, e) => _PrintDocument(0.25f);
mnuFilePrint10.Click = (s, e) => _PrintDocument(0.1f);
mnuFileImgPrint100.Click = (s, e) => _PrintImage(1.0f);
mnuFileImgPrint50.Click = (s, e) => _PrintImage(0.5f);
mnuFileImgPrint10.Click = (s, e) => _PrintImage(0.1f);
}
#region Main Menu
private void mnuFileSave_Click(object sender, EventArgs e)
{
using (var dialog = new SaveFileDialog())
{
dialog.InitialDirectory = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (var fs = System.IO.File.OpenWrite(dialog.FileName))
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(fs, _mManager);
}
}
}
}
private void mnuFileOpen_Click(object sender, EventArgs e)
{
using (var dialog = new OpenFileDialog())
{
dialog.InitialDirectory = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (var fs = System.IO.File.OpenRead(dialog.FileName))
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
_mManager = bf.Deserialize(fs) as ProjectManager;
if (_mManager == null)
{
MessageBox.Show("Unable to load ProjectManager. Data structure might have changed from previous verions", "Gantt Chart", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
_mChart.Init(_mManager);
_mChart.Invalidate();
}
}
}
}
}
private void mnuFileExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void mnuViewDaysDayOfWeek_Click(object sender, EventArgs e)
{
_mManager.TimeScale = TimeScale.Day;
_mChart.TimeScaleDisplay = TimeScaleDisplay.DayOfWeek;
_mChart.Invalidate();
}
private void mnuFileNew_Click(object sender, EventArgs e)
{
// start a new Project and init the chart with the project
_mManager = new ProjectManager();
_mManager.Add(new Task() { Name = "New Task" });
_mChart.Init(_mManager);
_mChart.Invalidate();
}
private void mnuHelpAbout_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Please visit http://www.jakesee.com/net-c-winforms-gantt-chart-control/ for more help and details", "Braincase Solutions - Gantt Chart", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
{
System.Diagnostics.Process.Start("http://www.jakesee.com/net-c-winforms-gantt-chart-control/");
}
}
private void mnuViewRelationships_Click(object sender, EventArgs e)
{
_mChart.ShowRelations = mnuViewRelationships.Checked = !mnuViewRelationships.Checked;
_mChart.Invalidate();
}
private void mnuViewSlack_Click(object sender, EventArgs e)
{
_mChart.ShowSlack = mnuViewSlack.Checked = !mnuViewSlack.Checked;
_mChart.Invalidate();
}
private void mnuViewIntructions_Click(object sender, EventArgs e)
{
_mOverlay.PrintMode = !(mnuViewIntructions.Checked = !mnuViewIntructions.Checked);
_mChart.Invalidate();
}
#region Timescale Views
private void mnuViewDays_Click(object sender, EventArgs e)
{
_mManager.TimeScale = TimeScale.Day;
mnuViewDays.Checked = true;
mnuViewWeek.Checked = false;
_mChart.Invalidate();
}
private void mnuViewWeek_Click(object sender, EventArgs e)
{
_mManager.TimeScale = TimeScale.Week;
mnuViewDays.Checked = false;
mnuViewWeek.Checked = true;
_mChart.Invalidate();
}
private void mnuViewDayOfWeek_Click(object sender, EventArgs e)
{
_mChart.TimeScaleDisplay = TimeScaleDisplay.DayOfWeek;
mnuViewDayOfWeek.Checked = true;
mnuViewDayOfMonth.Checked = false;
mnuViewWeekOfYear.Checked = false;
_mChart.Invalidate();
}
private void mnuViewDayOfMonth_Click(object sender, EventArgs e)
{
_mChart.TimeScaleDisplay = TimeScaleDisplay.DayOfMonth;
mnuViewDayOfWeek.Checked = false;
mnuViewDayOfMonth.Checked = true;
mnuViewWeekOfYear.Checked = false;
_mChart.Invalidate();
}
private void mnuViewWeekOfYear_Click(object sender, EventArgs e)
{
_mChart.TimeScaleDisplay = TimeScaleDisplay.WeekOfYear;
mnuViewDayOfWeek.Checked = false;
mnuViewDayOfMonth.Checked = false;
mnuViewWeekOfYear.Checked = true;
_mChart.Invalidate();
}
#endregion Timescale Views
#endregion Main Menu
#region Sidebar
private void _mDateTimePicker_ValueChanged(object sender, EventArgs e)
{
_mManager.Start = _mStartDatePicker.Value;
var span = DateTime.Today - _mManager.Start;
_mManager.Now = (int)Math.Round(span.TotalDays);
if (_mManager.TimeScale == TimeScale.Week) _mManager.Now = (_mManager.Now % 7) * 7;
_mChart.Invalidate();
}
private void _mPropertyGrid_SelectedGridItemChanged(object sender, SelectedGridItemChangedEventArgs e)
{
_mChart.Invalidate();
}
private void _mNowDatePicker_ValueChanged(object sender, EventArgs e)
{
TimeSpan span = _mNowDatePicker.Value - _mStartDatePicker.Value;
_mManager.Now = span.Days 1;
if (_mManager.TimeScale == TimeScale.Week) _mManager.Now = _mManager.Now / 7 (_mManager.Now % 7 > 0 ? 1 : 0);
_mChart.Invalidate();
}
private void _mScrollDatePicker_ValueChanged(object sender, EventArgs e)
{
_mChart.ScrollTo(_mScrollDatePicker.Value);
_mChart.Invalidate();
}
private void _mTaskGridView_SelectionChanged(object sender, EventArgs e)
{
if (TaskGridView.SelectedRows.Count > 0)
{
var task = TaskGridView.SelectedRows[0].DataBoundItem as Task;
_mChart.ScrollTo(task);
}
}
#endregion Sidebar
#region Print
private void _PrintDocument(float scale)
{
using (var dialog = new PrintDialog())
{
dialog.Document = new System.Drawing.Printing.PrintDocument();
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// set the print mode for the custom overlay painter so that we skip printing instructions
dialog.Document.BeginPrint = (s, arg) => _mOverlay.PrintMode = true;
dialog.Document.EndPrint = (s, arg) => _mOverlay.PrintMode = false;
// tell chart to print to the document at the specified scale
_mChart.Print(dialog.Document, scale);
}
}
}
private void _PrintImage(float scale)
{
using (var dialog = new SaveFileDialog())
{
dialog.Filter = "Bitmap (*.bmp) | *.bmp";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// set the print mode for the custom overlay painter so that we skip printing instructions
_mOverlay.PrintMode = true;
// tell chart to print to the document at the specified scale
var bitmap = _mChart.Print(scale);
_mOverlay.PrintMode = false; // restore printing overlays
bitmap.Save(dialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
}
}
}
#endregion Print
}
#region overlay painter
/// <summary>
/// An example of how to encapsulate a helper painter for painter additional features on Chart
/// </summary>
public class OverlayPainter
{
/// <summary>
/// Hook such a method to the chart paint event listeners
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ChartOverlayPainter(object sender, ChartPaintEventArgs e)
{
// Don't want to print instructions to file
if (this.PrintMode) return;
var g = e.Graphics;
var chart = e.Chart;
// Demo: Static billboards begin -----------------------------------
// Demonstrate how to draw static billboards
// "push matrix" -- save our transformation matrix
e.Chart.BeginBillboardMode(e.Graphics);
// draw mouse command instructions
int margin = 300;
int left = 20;
var color = chart.HeaderFormat.Color;
StringBuilder builder = new StringBuilder();
builder.AppendLine("THIS IS DRAWN BY A CUSTOM OVERLAY PAINTER TO SHOW DEFAULT MOUSE COMMANDS.");
builder.AppendLine("*******************************************************************************************************");
builder.AppendLine("Left Click - Select task and display properties in PropertyGrid");
builder.AppendLine("Left Mouse Drag - Change task starting point");
builder.AppendLine("Right Mouse Drag - Change task duration");
builder.AppendLine("Middle Mouse Drag - Change task complete percentage");
builder.AppendLine("Left Doubleclick - Toggle collaspe on task group");
builder.AppendLine("Right Doubleclick - Split task into task parts");
builder.AppendLine("Left Mouse Dragdrop onto another task - Group drag task under drop task");
builder.AppendLine("Right Mouse Dragdrop onto another task part - Join task parts");
builder.AppendLine("SHIFT Left Mouse Dragdrop onto another task - Make drop task precedent of drag task");
builder.AppendLine("ALT Left Dragdrop onto another task - Ungroup drag task from drop task / Remove drop task from drag task precedent list");
builder.AppendLine("SHIFT Left Mouse Dragdrop - Order tasks");
builder.AppendLine("SHIFT Middle Click - Create new task");
builder.AppendLine("ALT Middle Click - Delete task");
builder.AppendLine("Left Doubleclick - Toggle collaspe on task group");
var size = g.MeasureString(builder.ToString(), e.Chart.Font);
var background = new Rectangle(left, chart.Height - margin, (int)size.Width, (int)size.Height);
background.Inflate(10, 10);
g.FillRectangle(new System.Drawing.Drawing2D.LinearGradientBrush(background, Color.LightYellow, Color.Transparent, System.Drawing.Drawing2D.LinearGradientMode.Vertical), background);
g.DrawRectangle(Pens.Brown, background);
g.DrawString(builder.ToString(), chart.Font, color, new PointF(left, chart.Height - margin));
// "pop matrix" -- restore the previous matrix
e.Chart.EndBillboardMode(e.Graphics);
// Demo: Static billboards end -----------------------------------
}
public bool PrintMode { get; set; }
}
#endregion overlay painter
#region custom task and resource
/// <summary>
/// A custom resource of your own type (optional)
/// </summary>
[Serializable]
public class MyResource
{
public string Name { get; set; }
}
/// <summary>
/// A custom task of your own type deriving from the Task interface (optional)
/// </summary>
[Serializable]
public class MyTask : Task
{
public MyTask(ProjectManager manager)
: base()
{
Manager = manager;
}
private ProjectManager Manager { get; set; }
public new int Start { get { return base.Start; } set { Manager.SetStart(this, value); } }
public new int End { get { return base.End; } set { Manager.SetEnd(this, value); } }
public new int Duration { get { return base.Duration; } set { Manager.SetDuration(this, value); } }
public new float Complete { get { return base.Complete; } set { Manager.SetComplete(this, value); } }
}
#endregion custom task and resource
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论