1

我已经在时间线视图上实现了 Telerik 调度程序。我允许我的 y 轴资源(倡导者)和会议之间存在 M:M 关系。这是我的调度程序的样子:

时间线视图

当我双击会议的一个实例时,会出现高级编辑对话框。但是,在这里,没有一个倡导者被选为会议的参与者:

倡导资源 - 编辑会议对话框

本次会议出现在时间轴上的有许多倡导者。为什么它们没有在编辑表单中显示为选中状态?

问题还不止于此。我有第二种资源(立法者),它也与会议有 M:M 关系。这里有一个类似的问题 - 我为这次会议和 4 位立法者定义了关系,但只检查了第一个立法者(其他三个保持未检查):

立法者资源 - 编辑会议对话框

我需要添加另外两种类型的资源(同样,每一种都是 M:M with Meetings),我希望我会遇到与我已经添加的两种类似的问题。

我已经能够通过更改调度程序的分组和通过 SQL 查询来直观地验证数据库中的关系是否有效。那么,为什么我无法查看每个相关资源的检查?我的调度程序代码如下:

<telerik:RadScheduler runat="server" ID="RadScheduler1" 
    AdvancedForm-Enabled="true"
    AllowEdit="true" 
    AllowInsert="true" 
    DataEndField="End"
    DataKeyField="ID" 
    DataSourceID="EventsDataSource" 
    DataStartField="Start"
    DataSubjectField="Subject" 
    DayEndTime="17:00:00" 
    DayStartTime="07:00:00" 
    EnableAdvancedForm="true"
    Localization-HeaderMultiDay="Work Week" 
    OverflowBehavior="Expand" 
    OnAppointmentDelete="OnAppointmentDelete"
    OnAppointmentInsert="OnAppointmentInsert" 
    OnAppointmentUpdate="OnAppointmentEdited"
    OnNavigationComplete="RadScheduler1_NavigationComplete"
    SelectedDate="9/20/2011" 
    SelectedView="TimelineView" 
    >
        <AppointmentContextMenuSettings EnableDefault="true" />     
    <AdvancedForm Modal="true" />
    <ResourceTypes>
        <telerik:ResourceType KeyField="Adv_AdvocateID" AllowMultipleValues="true" Name="Advocate" TextField="Adv_FullName" ForeignKeyField="Adv_AdvocateID"
            DataSourceID="AdvocatesDataSource" />
    </ResourceTypes>
    <ResourceTypes>
        <telerik:ResourceType KeyField="Leg_LegID" Name="Legislator" AllowMultipleValues="true" TextField="Leg_FullName" ForeignKeyField="Leg_LegID"
            DataSourceID="LegislatorsDataSource" />
    </ResourceTypes>
    <TimelineView UserSelectable="true" GroupBy="Advocate" GroupingDirection="Vertical" />
    <MultiDayView UserSelectable="false" />
    <DayView UserSelectable="false" />
    <WeekView UserSelectable="false" />
    <MonthView UserSelectable="false" />
</telerik:RadScheduler>

我希望有人可以深入了解如何在编辑约会对话框中正确显示所选资源,并提前感谢您的帮助。

4

1 回答 1

1

我之前在看那个表格,你刚刚找到的那个,这就是促使我问的原因。下面的方法似乎是我最关注的方法,因为它们似乎负责复选框的填充和每个条目的检查。

问题是,您现在拥有的东西很好,您只需将您的复选框控件替换为代码,而不是像他们那样创建一个。

编辑:我通过程序查看按顺序调用的内容,以便您可以相应地调整它们以适合您的数据。

protected void Page_Load(object sender, EventArgs e)
{
    SemanticCheckBoxList resourceValue = new SemanticCheckBoxList();
    resourceValue.ID = "ResourceValue";
    ResourceValuesPlaceHolder.Controls.Add(resourceValue);

    if (resourceValue.Items.Count == 0)
    {
        PopulateResources();
        MarkSelectedResources();
    }
}


private void PopulateResources()
{
    foreach (Resource res in GetResources(Type))
    {
        ResourceValue.Items.Add(new ListItem(res.Text, SerializeResourceKey(res.Key)));
    }
}

private IEnumerable<Resource> GetResources(string resType)
{
    List<Resource> availableResources = new List<Resource>();
    IEnumerable<Resource> resources = Owner.Resources.GetResourcesByType(resType);

    foreach (Resource res in resources)
    {
        if (IncludeResource(res))
        {
            availableResources.Add(res);
        }
    }

    return availableResources;
}

private bool IncludeResource(Resource res)
{
    return res.Available || ResourceIsInUse(res);
}

private string SerializeResourceKey(object key)
{
    LosFormatter output = new LosFormatter();
    StringWriter writer = new StringWriter();
    output.Serialize(writer, key);
    return writer.ToString();
}

private void MarkSelectedResources()
{
    foreach (Resource res in Appointment.Resources.GetResourcesByType(Type))
    {
        ResourceValue.Items.FindByValue(SerializeResourceKey(res.Key)).Selected = true;
    }
}

我认为您不会使用通过页面加载的代码,您只需要调用条件 if 语句中的方法即可。

于 2011-09-27T14:41:35.250 回答