To reproduce: run the sample project and scroll to the end of the view. You will notice that the tasks are not properly aligned. You can increase the GraphicalViewElement.OnePixelTime in order to make the alignment even worse. Workaround: Adjust the GraphicalViewElement.OnePixelTime in order to obtain the correct alignment.
To reproduce: public Form1() { InitializeComponent(); DataTable tasks = new DataTable("Tasks"); tasks.Columns.Add("Id", typeof(int)); tasks.Columns.Add("ParentId", typeof(int)); tasks.Columns.Add("Title", typeof(string)); tasks.Columns.Add("Start", typeof(DateTime)); tasks.Columns.Add("End", typeof(DateTime)); tasks.Columns.Add("Progress", typeof(decimal)); DataTable links = new DataTable("Links"); links.Columns.Add("StartId", typeof(int)); links.Columns.Add("EndId", typeof(int)); links.Columns.Add("LinkType", typeof(int)); DataSet data = new DataSet(); data.Tables.Add(tasks); data.Tables.Add(links); Random rand = new Random(); int cnt = 3000; int cnt2 = 6000; for (int i = 1; i < cnt; i++) { tasks.Rows.Add(i, 0, "Summary task title", DateTime.Now.AddDays(i), DateTime.Now.AddDays(i + 5), 30m); } for (int i = cnt; i < cnt2; i++) { tasks.Rows.Add(i, rand.Next(1, cnt), "First child task title", new DateTime(2010, 10, 10), new DateTime(2010, 10, 12), 10); } for (int i = 0; i < 2000; i++) { links.Rows.Add(rand.Next(cnt, cnt2), rand.Next(1, cnt), 1); } this.radGanttView1.GanttViewElement.TaskDataMember = "Tasks"; this.radGanttView1.GanttViewElement.ChildMember = "Id"; this.radGanttView1.GanttViewElement.ParentMember = "ParentId"; this.radGanttView1.GanttViewElement.TitleMember = "Title"; this.radGanttView1.GanttViewElement.StartMember = "Start"; this.radGanttView1.GanttViewElement.EndMember = "End"; this.radGanttView1.GanttViewElement.ProgressMember = "Progress"; this.radGanttView1.GanttViewElement.LinkDataMember = "Links"; this.radGanttView1.GanttViewElement.LinkStartMember = "StartId"; this.radGanttView1.GanttViewElement.LinkEndMember = "EndId"; this.radGanttView1.GanttViewElement.LinkTypeMember = "LinkType"; this.radGanttView1.GanttViewElement.DataSource = data; this.radGanttView1.Columns.Add("Start"); this.radGanttView1.Columns.Add("End"); } private void radButton1_Click(object sender, EventArgs e) { this.radGanttView1.PrintPreview(); }
To reproduce: click (mouse down) on a task but then release the mouse button off the task. It then stays selected even when I click on other tasks. You can repeat this over and over and end up with every task as "selected" as shown in the video. Workaround: AddHandler Me.RadGanttView1.GraphicalViewItemFormatting, AddressOf GraphicalViewItemFormatting Private Sub GraphicalViewItemFormatting(sender As Object, e As GanttViewGraphicalViewItemFormattingEventArgs) Dim taskItem As GanttViewTaskItemElement = TryCast(e.ItemElement, GanttViewTaskItemElement) If taskItem IsNot Nothing AndAlso taskItem.TaskElement.VisualState.Contains(".MouseDown") AndAlso Not taskItem.Selected Then taskItem.TaskElement.IsMouseDown = False End If End Sub
How to reproduce: this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineRange = Telerik.WinControls.UI.TimeRange.DayQuarterHours; this.radGanttView1.GanttViewElement.GraphicalViewElement.AutomaticTimelineTimeRange = true; this.radGanttView1.GanttViewElement.GraphicalViewElement.OnePixelTime = new TimeSpan(0, 0, 15); Workaround: at the moment the Gantt control does not support an automatic timeline range for day quarter hours. The TimeRange.DayQuarterHours is similar to the half days and they should be handled the same way when in automatic timeline. If possible TimeRange.DayHalfHours this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineRange = Telerik.WinControls.UI.TimeRange.DayHalfHours;
Please look at the attached screenshot. Workaround: you can replace the StackLayoutElement used in the GanttViewTimelineItemBottomStackElement with a DockLayoutPanel for example as follows: Public Class CustomGanttViewTimelineItemElement Inherits GanttViewTimelineItemElement Public Sub New(data As GanttViewTimelineDataItem, graphicalViewElement As GanttViewGraphicalViewElement) MyBase.New(data, graphicalViewElement) End Sub Dim dock As DockLayoutPanel Protected Overrides Sub CreateChildElements() MyBase.CreateChildElements() dock = New DockLayoutPanel() dock.StretchHorizontally = True dock.LastChildFill = False Me.Children.RemoveAt(Me.Children.Count - 1) Me.Children.Add(dock) End Sub Protected Overrides Sub CalculateItems() Me.SuspendLayout() Dim cellInfo As GanttTimelineCellsInfo = Me.GraphicalViewElement.TimelineBehavior.GetTimelineCellInfoForItem(Me.Data, Me.GraphicalViewElement.TimelineRange) While Me.dock.Children.Count > cellInfo.NumberOfcells Me.dock.Children.RemoveAt(0) End While While Me.dock.Children.Count < cellInfo.NumberOfcells Dim element As LightVisualElement = Me.GraphicalViewElement.TimelineBehavior.CreateElement() Me.dock.Children.Add(element) End While Me.TopElement.Text = Me.GraphicalViewElement.TimelineBehavior.GetTimelineTopElementText(Me.Data) For i As Integer = 0 To Me.dock.Children.Count - 1 DirectCast(Me.dock.Children(i), LightVisualElement).Text = Me.GraphicalViewElement.TimelineBehavior.GetTimelineBottomElementText(Me.Data, i + cellInfo.StartIndex) Next Me.ResumeLayout(True) End Sub Protected Overrides Function MeasureOverride(availableSize As SizeF) As SizeF Dim clientRect As RectangleF = Me.GetClientRectangle(availableSize) Dim width As Single = Me.Data.Width - Me.GraphicalViewElement.TimelineContainer.ItemSpacing + availableSize.Width - clientRect.Width Me.TopElement.Measure(New SizeF(width, clientRect.Height / 2.0F)) Me.dock.Measure(New SizeF(width, clientRect.Height / 2.0F)) Return New SizeF(width, Me.TopElement.DesiredSize.Height + Me.dock.DesiredSize.Height) End Function Protected Overrides Function ArrangeOverride(finalSize As SizeF) As SizeF Dim clientRect As RectangleF = Me.GetClientRectangle(finalSize) Dim topRect As New RectangleF(clientRect.X, clientRect.Y, Me.DesiredSize.Width, clientRect.Height / 2.0F) Me.TopElement.Arrange(topRect) Dim bottomRect As New RectangleF(clientRect.X, topRect.Bottom, Me.DesiredSize.Width, clientRect.Height - topRect.Height) Me.dock.Arrange(bottomRect) Return clientRect.Size End Function End Class Public Class CustomGanttViewTimelineElementProvider Inherits GanttViewTimelineElementProvider Public Sub New(owner As GanttViewGraphicalViewElement) MyBase.New(owner) End Sub Public Overrides Function CreateElement(data As GanttViewTimelineDataItem, context As Object) As IVirtualizedElement(Of GanttViewTimelineDataItem) Dim element As GanttViewTimelineItemElement = Me.OnItemElementCreating(data) Return New CustomGanttViewTimelineItemElement(data, Owner) End Function End Class
To reproduce: please refer to the attached sample project. Try to edit the title for one of the child tasks in the grid and click the Workaround: private void radGanttView1_ItemChanged(object sender, Telerik.WinControls.UI.GanttViewItemChangedEventArgs e) { IEditableObject editebleObejct = e.Item.DataBoundItem as IEditableObject; if (editebleObejct != null) { editebleObejct.EndEdit(); } }
How to reproduce: 1. Run the project 2. Press the radButton1 3. Edit description of the first line (Line whose Identifier is TestProject1) 4. Clicking some other line to end the edit causes the ASSERT to come up
Hey,
We have a problem with the GanttViewTimeLineContainer as you see in the screeshot : gantt_print2.png
When we are in TimeLineRange = TimeRange.Year and we print the gantt, we have a problem with the appearence of GanttViewTimeLineContainer, we can see the first line with the year (it's ok) but after, the second line we can see a reperition of all month : jfmamjjasond jfmamjjasond jfmamjjasond jfmamjjasond etc etc etc
Can we change the appearence ? Do you have an explanation for this visualization ?
Thank you,
Regards,
Valériane E.
To reproduce: run the sample project and try to move a task. Workaround: Timer timer = new Timer(); private void DragDropService_Stopped(object sender, EventArgs e) { timer = new Timer(); timer.Interval = 300; timer.Tick += timer_Tick; } private void timer_Tick(object sender, EventArgs e) { timer.Stop(); data.Tables["Tasks"].Clear(); } Workaround 2: private void radGanttView1_ItemElementCreating(object sender, Telerik.WinControls.UI.GanttViewItemElementCreatingEventArgs e) { if (e.Item.Items.Count == 0 && e.ViewElement is GanttViewGraphicalViewElement) { e.ItemElement = new MyGanttViewTaskItemElement(e.ViewElement as GanttViewGraphicalViewElement); } } public class MyGanttViewTaskItemElement : GanttViewTaskItemElement { public MyGanttViewTaskItemElement(GanttViewGraphicalViewElement ganttViewBaseViewElement) : base(ganttViewBaseViewElement) { } protected override Type ThemeEffectiveType { get { return typeof(GanttViewTaskItemElement); } } public override void Detach() { var obj = this.Data; this.Data.SuspendPropertyNotifications(); base.Detach(); obj.ResumePropertyNotifications(); } public override void Synchronize() { DataSet ds = this.Data.GanttViewElement.DataSource as DataSet; if (ds != null && this.Data != null) { DataRowView rowView = this.Data.DataBoundItem as DataRowView; if (rowView != null && !RowExists(rowView.Row))//!ds.Tables[0].Rows.Contains(rowView.Row)) { return; } } base.Synchronize(); } private bool RowExists(DataRow dataRow) { DataSet ds = this.Data.GanttViewElement.DataSource as DataSet; bool res = false; foreach (DataRow r in ds.Tables[0].Rows) { if (r.Equals(dataRow)) { return true; } } return res; } }
To reproduce: 1) Open the Demo application >> Settings example. 2) Select a task and activate the editor for it. 3) Delete the task by clicking the button above. It may be necessary to repeat the steps several times. The error is not reproduced immediately.
To reproduce: - Set the range to lest than one day. - Set the TimelineRange to DayHalfHours Workaround: Make sure that the range is at least one day.
To reproduce: public RadForm1() { InitializeComponent(); DataTable tasks = new DataTable("Tasks"); tasks.Columns.Add("Id", typeof(int)); tasks.Columns.Add("ParentId", typeof(int)); tasks.Columns.Add("Title", typeof(string)); tasks.Columns.Add("Start", typeof(DateTime)); tasks.Columns.Add("End", typeof(DateTime)); tasks.Columns.Add("Progress", typeof(decimal)); DataTable links = new DataTable("Links"); links.Columns.Add("StartId", typeof(int)); links.Columns.Add("EndId", typeof(int)); links.Columns.Add("LinkType", typeof(int)); tasks.Rows.Add(1, 0, "Summary task title", new DateTime(2010, 10, 8), new DateTime(2010, 10, 18), 30m); tasks.Rows.Add(2, 1, "First child task title", new DateTime(2010, 10, 10), new DateTime(2010, 10, 12), 10); tasks.Rows.Add(3, 1, "Second child task title", new DateTime(2010, 10, 12), new DateTime(2010, 10, 15), 20m); tasks.Rows.Add(4, 1, "Milestone", new DateTime(2010, 10, 15), new DateTime(2010, 10, 15), 0m); links.Rows.Add(2, 3, 1); links.Rows.Add(3, 4, 1); DataSet data = new DataSet(); data.Tables.Add(tasks.Copy()); data.Tables.Add(links); this.radGridView1.DataSource = tasks; radGridView1.BestFitColumns(); this.radGanttView1.CreateDataItem += radGanttView1_CreateDataItem; this.radGanttView1.AllowSummaryEditing = true; this.radGanttView1.GanttViewElement.TaskDataMember = "Tasks"; this.radGanttView1.GanttViewElement.ChildMember = "Id"; this.radGanttView1.GanttViewElement.ParentMember = "ParentId"; this.radGanttView1.GanttViewElement.TitleMember = "Title"; this.radGanttView1.GanttViewElement.StartMember = "Start"; this.radGanttView1.GanttViewElement.EndMember = "End"; this.radGanttView1.GanttViewElement.ProgressMember = "Progress"; this.radGanttView1.GanttViewElement.LinkDataMember = "Links"; this.radGanttView1.GanttViewElement.LinkStartMember = "StartId"; this.radGanttView1.GanttViewElement.LinkEndMember = "EndId"; this.radGanttView1.GanttViewElement.LinkTypeMember = "LinkType"; this.radGanttView1.GanttViewElement.DataSource = data; this.radGanttView1.Columns.Add("Start"); this.radGanttView1.Columns.Add("End"); this.radGanttView1.Columns.Add("Progress"); this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 7); this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = new DateTime(2010, 12, 10); } You will notice that the start and end of the summary task are changed in the gantt view. Workaround: void radGanttView1_CreateDataItem(object sender, CreateGanttDataItemEventArgs e) { e.Item = new MyGanttViewDataItem(); } public class MyGanttViewDataItem : GanttViewDataItem { protected override void OnChildAdded(GanttViewDataItem child) { if (this.Parent != null && !this.GanttViewElement.AllowSummaryEditing) { base.OnChildAdded(child); } } protected override void OnChildRemoved(GanttViewDataItem child) { if (this.Parent != null && !this.GanttViewElement.AllowSummaryEditing) { base.OnChildRemoved(child); } } }
To reproduce: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: This line of code loads data into the 'WeddingPlannerDataSet.Tasks' table. You can move, or remove it, as needed. Me.TasksTableAdapter.Fill(Me.WeddingPlannerDataSet.Tasks) 'TODO: This line of code loads data into the 'WeddingPlannerDataSet.Links' table. You can move, or remove it, as needed. Me.LinksTableAdapter.Fill(Me.WeddingPlannerDataSet.Links) Me.RadGanttView1.GanttViewElement.TaskDataMember = "Tasks" Me.RadGanttView1.GanttViewElement.ChildMember = "Id" Me.RadGanttView1.GanttViewElement.ParentMember = "ParentId" Me.RadGanttView1.GanttViewElement.TitleMember = "Title" Me.RadGanttView1.GanttViewElement.StartMember = "Start" Me.RadGanttView1.GanttViewElement.EndMember = "End" Me.RadGanttView1.GanttViewElement.ProgressMember = "Progress" Me.RadGanttView1.GanttViewElement.LinkDataMember = "Links" Me.RadGanttView1.GanttViewElement.LinkStartMember = "StartId" Me.RadGanttView1.GanttViewElement.LinkEndMember = "EndId" Me.RadGanttView1.GanttViewElement.LinkTypeMember = "LinkType" Me.RadGanttView1.GanttViewElement.DataSource = Me.WeddingPlannerDataSet Me.RadGanttView1.Columns.Add("Start") Me.RadGanttView1.Columns.Add("End") Me.RadGanttView1.Ratio = 0.3 Me.RadGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = New DateTime(2006, 8, 20) Me.RadGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = New DateTime(2007, 4, 2) AddHandler Me.RadGanttView1.ItemChildIdNeeded, AddressOf ItemChildIdNeeded AddHandler Me.RadGanttView1.ItemAdding, AddressOf ItemAdding AddHandler Me.RadGanttView1.ItemAdded, AddressOf ItemAdded End Sub Dim integerIdCounter As Integer = 200 Private Sub ItemChildIdNeeded(sender As Object, e As Telerik.WinControls.UI.GanttViewItemChildIdNeededEventArgs) Me.integerIdCounter += 1 e.ChildId = Me.integerIdCounter End Sub Workaround: AddHandler Me.RadGanttView1.ContextMenuOpening, AddressOf RadGanttView1_ContextMenuOpening Private Sub RadGanttView1_ContextMenuOpening(sender As Object, e As Telerik.WinControls.UI.GanttViewContextMenuOpeningEventArgs) Dim item As RadMenuItem = DirectCast(e.Menu.Items(0), RadMenuItem) AddHandler item.Items(0).Click, AddressOf ItemClick End Sub Private Sub ItemClick(sender As Object, e As EventArgs) Me.RadGanttView1.GanttViewElement.GraphicalViewElement.Update(Telerik.WinControls.UI.RadGanttViewElement.UpdateActions.ExpandedChanged) End Sub
Workaround: Sub New() InitializeComponent() Me.SetUpGantt() Me.RadGanttView1.GanttViewElement.TextViewElement.Scroller.AllowHiddenScrolling = True AddHandler Me.RadGanttView1.MouseUp, AddressOf Me.RadGanttView1_MouseUp End Sub Private Sub RadGanttView1_MouseUp(sender As Object, e As MouseEventArgs) Dim location = e.Location Dim splitter As GanttViewViewsSplitterElement = TryCast(Me.RadGanttView1.ElementTree.GetElementAtPoint(e.Location), GanttViewViewsSplitterElement) If splitter IsNot Nothing Then Me.RadGanttView1.GanttViewElement.TextViewElement.Scroller.Scrollbar.Value = Me.RadGanttView1.GanttViewElement.GraphicalViewElement.VScrollBar.Value End If End Sub
To reproduce: add a RadGanttView and populate it with data. Use the GraphicalViewItemFormatting event in order to change the e.ItemElement.TaskElement.Text. However, the changes are not applied. Workaround: private void radGanttView1_GraphicalViewItemFormatting(object sender, GanttViewGraphicalViewItemFormattingEventArgs e) { e.ItemElement.Tag = "Custom text"; } public class CustomRadGanttView : RadGanttView { protected override RadGanttViewElement CreateGanttViewElement() { return new CustomRadGanttViewElement(); } public override string ThemeClassName { get { return typeof(RadGanttView).FullName; } } } public class CustomRadGanttViewElement : RadGanttViewElement { public CustomRadGanttViewElement() { } protected override Type ThemeEffectiveType { get { return typeof(RadGanttViewElement); } } protected override GanttViewGraphicalViewElement CreateGraphicalViewElement(RadGanttViewElement ganttView) { return new CustomGanttViewGraphicalViewElement(ganttView); } } public class CustomGanttViewGraphicalViewElement : GanttViewGraphicalViewElement { public CustomGanttViewGraphicalViewElement(RadGanttViewElement ganttView) : base(ganttView) { } protected override Type ThemeEffectiveType { get { return typeof(GanttViewGraphicalViewElement); } } protected override IVirtualizedElementProvider<GanttViewDataItem> CreateElementProvider() { return new CustomGanttViewVirtualizedElementProvider(this); } } public class CustomGanttViewVirtualizedElementProvider : GanttViewVirtualizedElementProvider { public CustomGanttViewVirtualizedElementProvider(GanttViewBaseViewElement owner) : base(owner) { } public override IVirtualizedElement<GanttViewDataItem> CreateElement(GanttViewDataItem data, object context) { IVirtualizedElement<GanttViewDataItem> taskElement = base.CreateElement(data, context) ; if (taskElement is GanttViewTaskItemElement) { FieldInfo fi = typeof(GanttViewVirtualizedElementProvider).GetField("owner", BindingFlags.NonPublic | BindingFlags.Instance); GanttViewBaseViewElement owner = fi.GetValue(this) as GanttViewBaseViewElement ; return new CustomGanttViewTaskItemElement(owner as GanttViewGraphicalViewElement); } return taskElement; } } public class CustomGanttViewTaskItemElement:GanttViewTaskItemElement { public CustomGanttViewTaskItemElement(GanttViewGraphicalViewElement owner) : base(owner) { } public override void Synchronize() { base.Synchronize(); if (this.Tag != null) { this.TaskElement.Text = this.Tag.ToString(); } } }
Dim data As New DataSet() Dim tasks As New DataTable("Tasks") Dim links As New DataTable("Links") Sub New() InitializeComponent() tasks.Columns.Add("Id", GetType(Integer)) tasks.Columns.Add("ParentId", GetType(Integer)) tasks.Columns.Add("Title", GetType(String)) tasks.Columns.Add("Start", GetType(DateTime)) tasks.Columns.Add("End", GetType(DateTime)) tasks.Columns.Add("Progress", GetType(Decimal)) links.Columns.Add("StartId", GetType(Integer)) links.Columns.Add("EndId", GetType(Integer)) links.Columns.Add("LinkType", GetType(Integer)) data.Tables.Add(tasks) data.Tables.Add(links) tasks.Rows.Add(1, 0, "1. Summary task title", New DateTime(2010, 10, 10), New DateTime(2010, 10, 15), 30D) tasks.Rows.Add(2, 1, "1.1 Task", New DateTime(2010, 10, 10), New DateTime(2010, 10, 12), 10) tasks.Rows.Add(3, 1, "1.2 Task", New DateTime(2010, 10, 12), New DateTime(2010, 10, 15), 20D) tasks.Rows.Add(4, 1, "1.3 Task", New DateTime(2010, 10, 10), New DateTime(2010, 10, 11), 20D) tasks.Rows.Add(5, 1, "Milestone", New DateTime(2010, 10, 15), New DateTime(2010, 10, 15), 0D) tasks.Rows.Add(6, 0, "2. Summary task title", New DateTime(2010, 10, 10), New DateTime(2010, 10, 13), 30D) tasks.Rows.Add(7, 6, "2.1 Task", New DateTime(2010, 10, 10), New DateTime(2010, 10, 11), 10) links.Rows.Add(2, 3, 1) links.Rows.Add(3, 5, 1) Bind() Me.RadGanttView1.Columns.Add("Start") Me.RadGanttView1.Columns.Add("End") Me.RadGanttView1.Columns.Add("Id") Me.RadGanttView1.Columns.Add("ParentId") Me.RadGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = New DateTime(2010, 10, 9) End Sub Private Sub Bind() Me.RadGanttView1.GanttViewElement.DataSource = Nothing Me.RadGanttView1.GanttViewElement.TaskDataMember = "Tasks" Me.RadGanttView1.GanttViewElement.ChildMember = "Id" Me.RadGanttView1.GanttViewElement.ParentMember = "ParentId" Me.RadGanttView1.GanttViewElement.TitleMember = "Title" Me.RadGanttView1.GanttViewElement.StartMember = "Start" Me.RadGanttView1.GanttViewElement.EndMember = "End" Me.RadGanttView1.GanttViewElement.ProgressMember = "Progress" Me.RadGanttView1.GanttViewElement.LinkDataMember = "Links" Me.RadGanttView1.GanttViewElement.LinkStartMember = "StartId" Me.RadGanttView1.GanttViewElement.LinkEndMember = "EndId" Me.RadGanttView1.GanttViewElement.LinkTypeMember = "LinkType" Me.RadGanttView1.GanttViewElement.DataSource = data End Sub Private Sub RadButtonClick(sender As Object, e As EventArgs) Handles RadButton2.Click tasks(3)("ParentId") = 6 Bind() End Sub Workaround: rebind the ganttview after changing the parent.
How to reproduce: public partial class RadForm1 : Telerik.WinControls.UI.RadForm { public RadForm1() { InitializeComponent(); this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 9); this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = new DateTime(2010, 12, 10); //setup data items GanttViewDataItem item1 = new GanttViewDataItem(); item1.Start = new DateTime(2010, 10, 10); item1.End = new DateTime(2010, 10, 15); item1.Progress = 30m; item1.Title = "Summary task.1. title"; GanttViewDataItem subitem11 = new GanttViewDataItem(); subitem11.Start = new DateTime(2010, 10, 10); subitem11.End = new DateTime(2010, 10, 12); subitem11.Progress = 10m; subitem11.Title = "Sub-task.1.1 title"; GanttViewDataItem subitem12 = new GanttViewDataItem(); subitem12.Start = new DateTime(2010, 10, 12); subitem12.End = new DateTime(2010, 10, 15); subitem12.Progress = 20m; subitem12.Title = "Sub-task.1.2 title"; //add subitems item1.Items.Add(subitem11); item1.Items.Add(subitem12); this.radGanttView1.Items.Add(item1); GanttViewDataItem item2 = new GanttViewDataItem(); item2.Start = new DateTime(2010, 10, 12); item2.End = new DateTime(2010, 10, 18); item2.Progress = 40m; item2.Title = "Summary task.2. title"; GanttViewDataItem subitem21 = new GanttViewDataItem(); subitem21.Start = new DateTime(2010, 10, 12); subitem21.End = new DateTime(2010, 10, 13); subitem21.Progress = 10m; subitem21.Title = "Sub-task.2.1 title"; GanttViewDataItem subitem22 = new GanttViewDataItem(); subitem22.Start = new DateTime(2010, 10, 13); subitem22.End = new DateTime(2010, 10, 18); subitem22.Progress = 30m; subitem22.Title = "Sub-task.2.2 title"; GanttViewDataItem subitem23 = new GanttViewDataItem(); subitem23.Start = new DateTime(2010, 10, 18); subitem23.End = new DateTime(2010, 10, 18); subitem23.Title = "Sub-task.2.3 title"; //add subitems item2.Items.Add(subitem21); item2.Items.Add(subitem22); item2.Items.Add(subitem23); this.radGanttView1.Items.Add(item2); //add links between items GanttViewLinkDataItem link1 = new GanttViewLinkDataItem(); link1.StartItem = subitem11; link1.EndItem = subitem12; link1.LinkType = TasksLinkType.FinishToStart; this.radGanttView1.Links.Add(link1); GanttViewLinkDataItem link2 = new GanttViewLinkDataItem(); link2.StartItem = subitem21; link2.EndItem = subitem22; link2.LinkType = TasksLinkType.StartToStart; this.radGanttView1.Links.Add(link2); GanttViewLinkDataItem link3 = new GanttViewLinkDataItem(); link3.StartItem = subitem22; link3.EndItem = subitem23; link3.LinkType = TasksLinkType.FinishToStart; this.radGanttView1.Links.Add(link3); GanttViewTextViewColumn titleColumn = new GanttViewTextViewColumn("Title"); GanttViewTextViewColumn startColumn = new GanttViewTextViewColumn("Start"); GanttViewTextViewColumn endColumn = new GanttViewTextViewColumn("End"); this.radGanttView1.GanttViewElement.Columns.Add(titleColumn); this.radGanttView1.GanttViewElement.Columns.Add(startColumn); this.radGanttView1.GanttViewElement.Columns.Add(endColumn); this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 13); } private void radButton1_Click(object sender, EventArgs e) { RadPrintDocument doc = new RadPrintDocument(); doc.Landscape = true; RadPrintPreviewDialog dialog = new RadPrintPreviewDialog(); doc.AssociatedObject = this.radGanttView1; dialog.Document = doc; dialog.ShowDialog(); } } Workaround: create a custom RadGanttView public class MyRadGanttView : RadGanttView { public override string ThemeClassName { get { return typeof(RadGanttView).FullName; } } protected override PointF[] GetElementShape(GanttViewPrintElementContext context, RectangleF rect) { if (shouldPaintStartCap) { return base.GetElementShape(context, rect); } switch (context) { case GanttViewPrintElementContext.SummaryTaskElement: PointF[] summaryPoints = new PointF[5]; summaryPoints[0] = rect.Location; summaryPoints[1] = new PointF(rect.X, rect.Y + rect.Height / 4f); summaryPoints[2] = new PointF(rect.Right - 3, rect.Y + rect.Height / 4f); summaryPoints[3] = new PointF(rect.Right, rect.Y + rect.Height / 2f); summaryPoints[4] = new PointF(rect.Right, rect.Y); return summaryPoints; case GanttViewPrintElementContext.MilestoneElement: PointF[] milestonePoints = new PointF[4]; milestonePoints[0] = new PointF(rect.X, rect.Y); milestonePoints[1] = new PointF(rect.X + rect.Height / 2f, rect.Y + rect.Height / 2f); milestonePoints[2] = new PointF(rect.X, rect.Y + rect.Height); milestonePoints[3] = new PointF(rect.X - rect.Height / 2f, rect.Y + rect.Height / 2f); return milestonePoints; default: return null; } } private bool shouldPaintStartCap; protected override RectangleF GetPrintRectangle(GanttViewDataItem item, int index) { if (index < 0) { return RectangleF.Empty; } float x = (float)((item.Start - this.GanttViewElement.GraphicalViewElement.TimelineBehavior.AdjustedTimelineStart).TotalSeconds / this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds); this.shouldPaintStartCap = x > 0 ? true : false; x = Math.Max(x, 0); float y = index * (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing) + this.GanttViewElement.HeaderHeight; float width = (float)((item.End - item.Start).TotalSeconds / (float)this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds); return new RectangleF(x, y, width, (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing)); } }
Workaround: In the case of DateTime columns one can handle the PrintElementFormating event and change text of the print elements with the required format string private void RadGanttView1_PrintElementFormatting(object sender, Telerik.WinControls.UI.GanttViewPrintElementFormattingEventArgs e) { if (e.PrintContext == GanttViewPrintElementContext.DataCell) { DateTime date; if (e.PrintElement.DrawText && DateTime.TryParse(e.PrintElement.Text, out date)) { e.PrintElement.Text = string.Format("{0:D}", date); } } }
See attached video to reproduce. Workaround: class MyGantt : RadGanttView { protected override RadGanttViewElement CreateGanttViewElement() { return new MyGanttElement(); } } class MyGanttElement : RadGanttViewElement { protected override void InitializeFields() { base.InitializeFields(); ThemeRole = "RadGanttViewElement"; } protected override bool EndEditCore(bool commitChanges) { if (this.ActiveEditor.Value == null) { GanttViewDataItem item = this.SelectedItem as GanttViewDataItem; this.ActiveEditor.Value = item[CurrentColumn]; } return base.EndEditCore(commitChanges); } }