【问题标题】:Resources not being 'selected' in Telerik Scheduler Edit DialogTelerik Scheduler 编辑对话框中未“选择”资源
【发布时间】:2011-11-25 10:32:54
【问题描述】:

我已经在时间线视图上实现了 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>

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

【问题讨论】:

  • 自从你上次发帖后看起来不错。我很好奇您在编辑/查看这些约会的详细信息时是否有任何代码来处理复选框的“检查”。如果可以,可以发一下吗?
  • 谢谢老板。我什么都没有处理。根据 Telerik 的示例,调度程序控制似乎足够聪明,可以解决这个问题。在我的实现中,它能够自行找出第一个“立法者”检查。我希望为您澄清!
  • 只是因为我无法将任何项目设置为与您的项目完全一样,当您打开“编辑约会”窗口时是否会触发任何类型的事件?另外,您在参考哪个示例时看到它在做什么?我有几个打开了,想比较一下。
  • 在编辑约会之前不会触发任何事件。我在看这个演示 - demos.telerik.com/aspnet-ajax/scheduler/examples/… 虽然现在我仔细观察,我看到有一个下拉列表,并且在 MultipleValuesResourceControlCS.ascx.cs 源中,我可以看到检查是在一个调用的方法中设置的Page_Load() 方法。我猜想通过模拟和修改该控件,我还可以实现下拉列表而不是复选框列表。我在正确的轨道上吗?
  • Telerik 组件很棒。调度程序是一块垃圾。我花了很多个晚上试图让那些令人费解的垃圾做一些远程有用的事情。讨厌 2 说出来,但我最终还是自己动手。

标签: c# asp.net telerik radscheduler


【解决方案1】:

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

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

编辑:我查看了Program 以查看被称为顺序的内容,以便您可以相应地调整它们以适合您的数据。

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 语句中的方法即可。

【讨论】:

  • 我从您链接的项目中实现了控件,并且我的调度程序现在正在使用具有多值资源控件的网格(不包括提供程序,我使用的是 ResourceTypes 字段)。但是我无法让程序选择一个以上的关系在数据库中定义的资源。当我设置断点并逐步执行 MarkSelectedResources() 方法时,对 Appointment.Resources.GetResourcesByType(Type) 的调用仅返回其中一个资源。
  • 当您单步执行代码并到达 foreach(资源中的资源)时,您的调度程序正在拉多少资源。该示例有 3 个学生,当它到达私有 IEnumerable GetResources(string resType) 方法时,您可以看到它正在提取正确的数量,然后继续用不同的方法标记它们。 i.imgur.com/MqxMf.png
  • 我想我可能知道问题出在哪里,但是在 cmets 中聊天是不受欢迎的。认为您可以加入位于本网站顶部的名为 Telerik 的聊天室吗?我是那里唯一的人,可能会帮助你。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2015-07-17
  • 2012-09-13
  • 2023-03-16
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多