Gantt Chart Predecessors使用JSGrid控件

时间:2011-11-22 15:24:35

标签: c# asp.net sharepoint gantt-chart

我正在尝试使用共享点控件创建一个甘特图生成器:

<Sharepoint:JsGrid>

我遵循了本教程:How to: Create a Gantt Chart Using the JS Grid Control

我还将我的Sharepoint TaskList链接为数据源。

我使用一些XML开发了一个过滤系统。

但我现在想管理前辈并用箭头表示依赖关系。

为了管理它们,我使用了EnableGantt函数的最后一个参数(ganttDependentsColumnName),只需要包含依赖项信息的列的名称。

我必须在这个专栏中加入什么?

我尝试的是用任务的ID,包含前辈的DataRow的通道填充它,并且我试图放置类依赖的对象:

class Dependency : IJsonSerializable
{
    public object Key {get; set;} // RecordKey
    public LinkType{get; set;} //LinkType

    public string ToJson(Serializer s)
    {
        return JsonUtility.SerializeToJsonFromProperties(s,this);
    }
}

(此代码来自教程中的答案)

在钥匙中,我该怎么办?如果有人这样做或知道该怎么做,那可能会很好。

1 个答案:

答案 0 :(得分:1)

不确定您是否仍然面临此问题。但这就是我们为Predecessors专栏所做的事情,据我了解这一点:

1]稍微更改Dependency类以添加如图所示的构造函数(否则会出错)。

2]然后,您基本上需要将Dependency数组传递给Predecessors列,这意味着JSGrid控件需要知道依赖项的起点/行和结束点/行(因此需要一个数组)。由于继承和ToJson方法,JSON序列化已经处理好了,所以不用担心。

代码:

1]依赖类:

public class Dependency : IJsonSerializable
{
    public object Key { get; set; } // recordKey
    public LinkType Type { get; set; } // SP.JsGrid.LinkType

    public Dependency() {
        Key = DBNull.Value;
        Type = LinkType.FinishStart;
    }

    public string ToJson(Serializer s)
    {
        return JsonUtility.SerializeToJsonFromProperties(s, this);
    }
}

2]如果未定位SharePoint任务列表(其中数据是DataTable的对象),请添加列:

data.Columns.Add(new DataColumn("Predecessors",typeof(Dependency[])));

3]将正确的对象数组设置为Predecessors列:

    if (<<A predecessor exists>>){
    Dependency[] dep = new Dependency[2];
    dep[0] = new Dependency();
    try{
        /*
        // Unique Identifier for your row based on what you are 
        // passing to the GridSerializer while initializing it 
        // (as a third parameter which is called keyColumnName)
        // In my case I had to get it by doing some coding as  
        // shown. The first object in the array represents the 
        // previous row and so the unique identifier should  
        // point to the previous row
        */
        dep[0].Key = (
                data.Select(
                    "ID=" + 
                    data.Rows[s]["PredecessorsID"].ToString()
                    )
                    [0]["Key"]
                );
    }catch (Exception ex){ 
        dep[0].Key = DBNull.Value; 
    }
    dep[0].Type = LinkType.FinishStart;

    /*
    // Unique Identifier for your row based on what you are 
    // passing to the GridSerializer while initializing it 
    // (as a third parameter which is called keyColumnName)
    // In my case I had to get it by doing some coding as  
    // shown. The second object in the array represents the 
    // current row and so the unique identifier should  
    // point to the current row
    */
    dep[1] = new Dependency();
    try{ 
        dep[1].Key = data.Rows[s]["Key"]; 
    }catch (Exception ex){ 
        dep[0].Key = DBNull.Value; 
    }
    dep[1].Type = LinkType.StartFinish;
    data.Rows[s]["Predecessors"] = dep;
}

最后,在调用Predecessors函数时传递EnableGantt()列:

gds.EnableGantt(
    Convert.ToDateTime(
        dr["start Date"]
    ), 
    Convert.ToDateTime(
        dr["Due Date"]
    ), 
    GanttUtilities.GetStyleInfo(), 
    "Predecessors"
    );

确保您的 StartFinish FinishStart 链接类型匹配正确的行,并确保您的任务正确列出正确的任务开始日期和任务结束日期和前任密钥。