You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor SfSchedule时间线月视图:多资源行拖拽布局及交互实现咨询

针对Blazor SfSchedule培训调度应用的问题解答

1. 布局与拖拽交互是否可实现?

完全可以实现。Blazor SfSchedule的时间线月视图支持资源分组、自定义预约模板、拖拽事件拦截与数据更新,这些特性刚好覆盖你提出的所有布局与交互需求。

2. 资源、预约及自定义栏的建模方案

资源建模

定义一个RoomResource类,包含区分实体房间和远程行的标识:

public class RoomResource
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsRemote { get; set; } // 标记是否为远程培训行
}
  • 实体房间:创建约20条IsRemote=false的实例,对应每个培训室
  • 远程培训行:创建1条IsRemote=true的实例,放在资源列表顶部

预约建模

定义TrainingAppointment类,关联资源并存储讲师信息:

public class TrainingAppointment
{
    public int Id { get; set; }
    public string Subject { get; set; } // 课程名称
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public int? RoomId { get; set; } // 关联资源Id,远程时为null
    public string InstructorName { get; set; } // 讲师姓名
    public bool IsRemote { get; set; } // 标记是否为远程课程
}

自定义栏与拖拽交互实现

自定义预约模板

利用AppointmentTemplate将每个预约拆分为上下两栏,根据IsRemote控制讲师栏显示:

<SfSchedule>
    <ScheduleTemplates>
        <AppointmentTemplate>
            @{
                var appointment = context as TrainingAppointment;
            }
            <div class="appointment-container">
                <div class="course-top">@appointment.Subject</div>
                @if (!appointment.IsRemote)
                {
                    <div class="instructor-bottom">讲师:@appointment.InstructorName</div>
                }
            </div>
        </AppointmentTemplate>
    </ScheduleTemplates>
    <!-- 资源绑定、视图配置等 -->
</SfSchedule>

添加CSS样式拆分上下栏:

.appointment-container {
    display: flex;
    flex-direction: column;
    height: 100%;
}
.course-top {
    flex: 1;
    padding: 4px;
    border-bottom: 1px solid #eee;
}
.instructor-bottom {
    flex: 1;
    padding: 4px;
    font-size: 0.8em;
    color: #666;
}

拖拽交互处理

通过OnDragStop事件处理拖拽逻辑:

<SfSchedule OnDragStop="OnAppointmentDragStop">
    <!-- 其他配置 -->
</SfSchedule>

@code {
    private void OnAppointmentDragStop(DragStopEventArgs args)
    {
        var draggedAppointment = args.Data as TrainingAppointment;
        var targetResource = args.DraggedResource as RoomResource;

        if (targetResource != null)
        {
            if (targetResource.IsRemote)
            {
                // 拖拽到远程行:释放房间,隐藏讲师
                draggedAppointment.RoomId = null;
                draggedAppointment.IsRemote = true;
            }
            else
            {
                // 拖拽到其他实体房间:更新房间Id,保留讲师信息
                draggedAppointment.RoomId = targetResource.Id;
                draggedAppointment.IsRemote = false;
            }
            // 这里更新数据源,触发Schedule重新渲染
            UpdateAppointmentInDataSource(draggedAppointment);
        }
    }

    private void UpdateAppointmentInDataSource(TrainingAppointment appointment)
    {
        // 实现更新数据源的逻辑,比如从列表中找到对应项替换
    }
}

3. 参考资源

  • Syncfusion Blazor SfSchedule官方文档的资源分组章节:讲解时间线视图下如何绑定资源并按行展示
  • 官方文档的自定义预约模板部分:详细说明如何自定义预约的UI结构
  • 官方文档的拖拽与调整章节:介绍拖拽事件的参数与数据更新方法
  • Syncfusion官方演示站点中的「时间线月视图+资源分组」实例:可直观看到资源行的布局效果

内容的提问来源于stack exchange,提问作者krissam44

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:40:15