9 Answers, 1 is accepted
0
Mohammad
Top achievements
Rank 1
answered on 30 Dec 2014, 01:47 PM
Duration text is not appearing in radgantt column.
I have used following code to create Duration column:
![]()
I have used following code to create Duration column:
<Columns><telerik:GanttBoundColumn DataField="Title"></telerik:GanttBoundColumn><telerik:GanttBoundColumn DataField="Duration" ></telerik:GanttBoundColumn>
</Columns>0
Hello Mohammad,
Please make sure that the suggestion approach in the following article for the custom fields creation are correctly applied at your end:
http://www.telerik.com/help/aspnet-ajax/gantt-custom-tasks-field.html
Note that you need to define the GanttCustomField in the CustomTaskFields collection as demonstrated in the article above.
Regards,
Nencho
Telerik
Please make sure that the suggestion approach in the following article for the custom fields creation are correctly applied at your end:
http://www.telerik.com/help/aspnet-ajax/gantt-custom-tasks-field.html
Note that you need to define the GanttCustomField in the CustomTaskFields collection as demonstrated in the article above.
Regards,
Nencho
Telerik
0
Felix
Top achievements
Rank 1
answered on 17 Feb 2015, 12:49 PM
Hello,
I tried to add a custom column to show the duration of a task. I already have created a custom column for a description which works. But if I try the same for the custom column duration I get the javascript error:
TypeError: this.duration is not a function
},isMilestone:function(){return this.duration()===0;
So I wonder if this is a bug or my code is buggy.
My code looks like this:
public class CustomGanttTaskFactory : ITaskFactory
{
Task ITaskFactory.CreateTask()
{
return new CustomTask();
}
}
public class CustomTask : Task
{
public string Description
{
get { return (string)(ViewState["Description"] ?? ""); }
set { ViewState["Description"] = value; }
}
public double Duration
{
get { return (double)(ViewState["Duration"]); }
set { ViewState["Duration"] = value; }
}
protected override IDictionary<string, object> GetSerializationData()
{
var dict = base.GetSerializationData();
dict["Description"] = Description;
dict["Duration"] = Duration;
return dict;
}
public override void LoadFromDictionary(IDictionary values)
{
base.LoadFromDictionary(values);
Description = (string)values["Description"];
Duration = (double) values["Duration"];
}
}
public class GanttCustomProvider : GanttProviderBase
{
public override ITaskFactory TaskFactory
{
get { return new CustomGanttTaskFactory(); }
}
#region Tasks
public override List<ITask> GetTasks()
{
var tasks = new List<ITask>();
foreach (var task in GetTasks())
{
tasks.Add(new CustomTask
{
ID = task.Id,
ParentID = task.ParentID,
OrderID = task.OrderID,
Start = task.StartDate,
End = task.EndDate,
Summary = task.IsSummary,
Title = task.Name,
Description = task.Description,
Duration = (task.EndDate - task.StartDate).TotalDays
});
}
return tasks;
}
So I hope you can help me with my duration problem. Thanks.
Regards,
Felix
I tried to add a custom column to show the duration of a task. I already have created a custom column for a description which works. But if I try the same for the custom column duration I get the javascript error:
TypeError: this.duration is not a function
},isMilestone:function(){return this.duration()===0;
So I wonder if this is a bug or my code is buggy.
My code looks like this:
public class CustomGanttTaskFactory : ITaskFactory
{
Task ITaskFactory.CreateTask()
{
return new CustomTask();
}
}
public class CustomTask : Task
{
public string Description
{
get { return (string)(ViewState["Description"] ?? ""); }
set { ViewState["Description"] = value; }
}
public double Duration
{
get { return (double)(ViewState["Duration"]); }
set { ViewState["Duration"] = value; }
}
protected override IDictionary<string, object> GetSerializationData()
{
var dict = base.GetSerializationData();
dict["Description"] = Description;
dict["Duration"] = Duration;
return dict;
}
public override void LoadFromDictionary(IDictionary values)
{
base.LoadFromDictionary(values);
Description = (string)values["Description"];
Duration = (double) values["Duration"];
}
}
public class GanttCustomProvider : GanttProviderBase
{
public override ITaskFactory TaskFactory
{
get { return new CustomGanttTaskFactory(); }
}
#region Tasks
public override List<ITask> GetTasks()
{
var tasks = new List<ITask>();
foreach (var task in GetTasks())
{
tasks.Add(new CustomTask
{
ID = task.Id,
ParentID = task.ParentID,
OrderID = task.OrderID,
Start = task.StartDate,
End = task.EndDate,
Summary = task.IsSummary,
Title = task.Name,
Description = task.Description,
Duration = (task.EndDate - task.StartDate).TotalDays
});
}
return tasks;
}
So I hope you can help me with my duration problem. Thanks.
Regards,
Felix
0
Hello Felix,
In the attachment you can find a runnable sample, demonstrating the implementation of the RadGantt with a custom Duration column.
Note : telerik dll files are removed from the attachment.
Regards,
Nencho
Telerik
In the attachment you can find a runnable sample, demonstrating the implementation of the RadGantt with a custom Duration column.
Note : telerik dll files are removed from the attachment.
Regards,
Nencho
Telerik
0
Felix
Top achievements
Rank 1
answered on 20 Feb 2015, 09:02 AM
Hi Nencho,
finally I got it to work. Didn't know that I'm not allowed to set the ClientPropertyName of the CustomField Duration to
"duration" and that I have to give the Datafield of the GanttBoundColumn for the duration the same value as the value of the ClientPropertyName. Thats kind of confusing but now it works. Thank you.
Regards,
Felix
finally I got it to work. Didn't know that I'm not allowed to set the ClientPropertyName of the CustomField Duration to
"duration" and that I have to give the Datafield of the GanttBoundColumn for the duration the same value as the value of the ClientPropertyName. Thats kind of confusing but now it works. Thank you.
Regards,
Felix
0
Felix
Top achievements
Rank 1
answered on 04 Mar 2015, 08:15 AM
Hi Nencho,
it seems that I was to premature regarding your
runnable example. Because as I tried to implement your solution into my
software I recognized that when I try to insert (same for delete or
update task) a task the page load method is called instead of the insert
method implemented inside the gantt custom provider. After that nothing
more happens except that the browser only shows the loading icon of the
script manager (see attached screenshot). At the moment I'm using the
new Q1 2015 Telerik version. I attach the sp as well and hope you
get the same behavour as I do ;-).
Regards,
Felix
it seems that I was to premature regarding your
runnable example. Because as I tried to implement your solution into my
software I recognized that when I try to insert (same for delete or
update task) a task the page load method is called instead of the insert
method implemented inside the gantt custom provider. After that nothing
more happens except that the browser only shows the loading icon of the
script manager (see attached screenshot). At the moment I'm using the
new Q1 2015 Telerik version. I attach the sp as well and hope you
get the same behavour as I do ;-).
01.<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>02. 03.<!DOCTYPE html>04. 05.<html xmlns="http://www.w3.org/1999/xhtml">06.<head id="Head1" runat="server">07. <title></title>08.</head>09.<body>10. <form id="form1" runat="server">11. <telerik:RadScriptManager ID="RadScriptManager1" runat="server"></telerik:RadScriptManager>12. <div>13. 14. <telerik:RadGantt runat="server" ID="RadGantt1" SelectedView="WeekView"15. AutoGenerateColumns="false">16. <Columns>17. <telerik:GanttBoundColumn DataField="ID" Width="90px"></telerik:GanttBoundColumn>18. <telerik:GanttBoundColumn DataField="Title"></telerik:GanttBoundColumn>19. <telerik:GanttBoundColumn DataField="Start" HeaderText="Start"></telerik:GanttBoundColumn>20. <telerik:GanttBoundColumn DataField="TaskDuration" HeaderText="Duration" UniqueName="TaskDuration"></telerik:GanttBoundColumn>21. </Columns>22. <CustomTaskFields>23. <telerik:GanttCustomField PropertyName="TaskDuration" ClientPropertyName="taskDuration" Type="String" />24. </CustomTaskFields>25. </telerik:RadGantt>26. 27. </div>28. </form>29.</body>30.</html>1.public partial class Default : System.Web.UI.Page 2.{3. protected void Page_Load(object sender, EventArgs e)4. {5. RadGantt1.Provider = new GanttCustomProvider();6. }7.}001.public class GanttCustomProvider : GanttProviderBase002.{003. public override ITaskFactory TaskFactory004. {005. get006. {007. return new CustomGanttTaskFactory();008. }009. }010. 011. #region Tasks012. 013. public override List<ITask> GetTasks()014. {015. var tasks = new List<ITask>();016. using (var db = new GanttEntities())017. {018. tasks.AddRange(db.GanttTasks.ToList().Select(task => new CustomTask019. {020. ID = task.ID,021. ParentID = task.ParentID,022. OrderID = task.OrderID,023. Start = task.Start,024. End = task.End,025. PercentComplete = task.PercentComplete,026. Summary = task.Summary,027. Title = task.Title,028. Expanded = task.Expanded.HasValue && task.Expanded.Value,029. TaskDuration = task.End - task.Start030. }));031. }032. return tasks;033. }034. 035. public override ITask UpdateTask(ITask task)036. {037. using (var db = new GanttEntities())038. {039. ((CustomTask)task).TaskDuration = task.End - task.Start;040. GanttTask entityTask = ToEntityTask(task);041. db.GanttTasks.Attach(entityTask);042. db.Entry(entityTask).State = EntityState.Modified;043. db.SaveChanges();044. }045. 046. return task;047. }048. 049. public override ITask DeleteTask(ITask task)050. {051. using (var db = new GanttEntities())052. {053. GanttTask entityTask = ToEntityTask(task);054. db.GanttTasks.Attach(entityTask);055. db.GanttTasks.Remove(entityTask);056. db.SaveChanges();057. }058. 059. return task;060. }061. 062. public override ITask InsertTask(ITask task)063. {064. using (var db = new GanttEntities())065. {066. task.ID = 0; // Value will be updated from DB067. GanttTask entityTask = ToEntityTask(task);068. db.GanttTasks.Add(entityTask);069. db.SaveChanges();070. 071. task.ID = entityTask.ID;072. }073. 074. return task;075. }076. 077. #endregion078. 079. #region Dependencies080. 081. public override List<IDependency> GetDependencies()082. {083. var dependencies = new List<IDependency>();084. using (var db = new GanttEntities())085. {086. dependencies.AddRange(db.GanttDependencies.ToList().Select(dependency => new Dependency()087. {088. ID = dependency.ID,089. PredecessorID = dependency.PredecessorID,090. SuccessorID = dependency.SuccessorID,091. Type = (DependencyType)dependency.Type092. }));093. }094. return dependencies;095. }096. 097. public override IDependency DeleteDependency(IDependency dependency)098. {099. using (var db = new GanttEntities())100. {101. GanttDependency entityDependency = ToEntityDependency(dependency);102. db.GanttDependencies.Attach(entityDependency);103. db.GanttDependencies.Remove(entityDependency);104. db.SaveChanges();105. }106. 107. return dependency;108. }109. 110. public override IDependency InsertDependency(IDependency dependency)111. {112. using (var db = new GanttEntities())113. {114. dependency.ID = 0; // Value will be updated from DB115. GanttDependency entityDependency = ToEntityDependency(dependency);116. db.GanttDependencies.Add(entityDependency);117. db.SaveChanges();118. 119. dependency.ID = entityDependency.ID;120. }121. 122. return dependency;123. }124. 125. #endregion126. 127. #region Helpers128. 129. private GanttTask ToEntityTask(ITask srcTask)130. {131. return new GanttTask132. {133. ID = (int)srcTask.ID,134. ParentID = (int?)srcTask.ParentID,135. OrderID = (int)srcTask.OrderID,136. Start = srcTask.Start,137. End = srcTask.End,138. PercentComplete = srcTask.PercentComplete,139. Summary = srcTask.Summary,140. Title = srcTask.Title,141. Expanded = srcTask.Expanded142. };143. }144. 145. private GanttDependency ToEntityDependency(IDependency srcDependency)146. {147. return new GanttDependency148. {149. ID = (int)srcDependency.ID,150. PredecessorID = (int)srcDependency.PredecessorID,151. SuccessorID = (int)srcDependency.SuccessorID,152. Type = (int)srcDependency.Type153. };154. }155. 156. #endregion157.}158. 159.public class CustomGanttTaskFactory : ITaskFactory160.{161. Task ITaskFactory.CreateTask()162. {163. return new CustomTask();164. }165.}166. 167.public class CustomTask : Task168.{169. public CustomTask()170. : base()171. {172. }173. 174. public TimeSpan TaskDuration175. {176. get { return (TimeSpan)(ViewState["TaskDuration"] ?? TimeSpan.MinValue); }177. set { ViewState["TaskDuration"] = value; }178. }179. 180. protected override IDictionary<string, object> GetSerializationData()181. {182. var dict = base.GetSerializationData();183. 184. dict["TaskDuration"] = TaskDuration.ToString();185. 186. return dict;187. }188. 189. public override void LoadFromDictionary(System.Collections.IDictionary values)190. {191. base.LoadFromDictionary(values);192. 193. TaskDuration = TimeSpan.Parse(values["TaskDuration"].ToString());194. }195.}Regards,
Felix
0
Felix
Top achievements
Rank 1
answered on 04 Mar 2015, 10:09 AM
Hi,
additionally to my post before I figuered out that a customganttprovider doesn't work properly if the managed pipeline mode is set to "Integrated". As soon as i set the mode to "Classic" the behaviour is as expected. But if I add an gantt custom field such as description or duration I get an error inside the output view. See below:
[quote]A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.NullReferenceException' occurred in App_Code.mms9agcy.dll
A first chance exception of type 'System.NullReferenceException' occurred in System.Web.Extensions.dll
A first chance exception of type 'System.NullReferenceException' occurred in Telerik.Web.UI.dll
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/13/ROOT-1-130699372019781403): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll'. Cannot find or open the PDB file.[/quote]
I hope this helps to find a solution for my problem. Thanks.
Regards,
Felix
additionally to my post before I figuered out that a customganttprovider doesn't work properly if the managed pipeline mode is set to "Integrated". As soon as i set the mode to "Classic" the behaviour is as expected. But if I add an gantt custom field such as description or duration I get an error inside the output view. See below:
[quote]A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.NullReferenceException' occurred in App_Code.mms9agcy.dll
A first chance exception of type 'System.NullReferenceException' occurred in System.Web.Extensions.dll
A first chance exception of type 'System.NullReferenceException' occurred in Telerik.Web.UI.dll
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/13/ROOT-1-130699372019781403): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll'. Cannot find or open the PDB file.[/quote]
I hope this helps to find a solution for my problem. Thanks.
Regards,
Felix
0
Hello Mohammad,
Regarding the managed pipeline mode - indeed there is such issue, which the developer team already investigates. However, I am afraid that I was unable to replicate the issue that you mentioned. I have used the custom provided implementation that you have demonstrated, but the behavior seems to be correct at my end.
This is why, I would suggest you to submit a support ticket and attach a runnable sample, demonstrating the problematic behavior at your end. Thus we will be able to inspect it locally and troubleshoot the problem for you.
Regards,
Nencho
Telerik
Regarding the managed pipeline mode - indeed there is such issue, which the developer team already investigates. However, I am afraid that I was unable to replicate the issue that you mentioned. I have used the custom provided implementation that you have demonstrated, but the behavior seems to be correct at my end.
This is why, I would suggest you to submit a support ticket and attach a runnable sample, demonstrating the problematic behavior at your end. Thus we will be able to inspect it locally and troubleshoot the problem for you.
Regards,
Nencho
Telerik
0
Felix
Top achievements
Rank 1
answered on 09 Mar 2015, 03:03 PM
Hello Nencho,
as I mentioned in my second post the example with the duration works as expected if I set the managed pipeline mode to "Classic".
[quote]additionally to my post before I figuered out that a customganttprovider
doesn't work properly if the managed pipeline mode is set to
"Integrated". As soon as i set the mode to "Classic" the behaviour is as
expected.[/quote]
I have had a problem if I wanted to use e.g. a custom field for a description which I forgot to insert into my example. But in the meantime I figured out what went wrong. Instead of casting my value to a string I wrote "values["Description"].toString()" inside the LoadFromDictionary-method which resulted to my mentioned error. But thanks for your answer.
Regards,
Felix
as I mentioned in my second post the example with the duration works as expected if I set the managed pipeline mode to "Classic".
[quote]additionally to my post before I figuered out that a customganttprovider
doesn't work properly if the managed pipeline mode is set to
"Integrated". As soon as i set the mode to "Classic" the behaviour is as
expected.[/quote]
I have had a problem if I wanted to use e.g. a custom field for a description which I forgot to insert into my example. But in the meantime I figured out what went wrong. Instead of casting my value to a string I wrote "values["Description"].toString()" inside the LoadFromDictionary-method which resulted to my mentioned error. But thanks for your answer.
Regards,
Felix
