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

Blazor C#:如何将外部卡片拖拽至Scheduler组件指定时段?

Blazor中实现左侧卡片拖拽到Telerik Scheduler指定时段的方案

一、使用Telerik原生拖拽组件实现

Telerik Blazor的DragDrop组件可以和Scheduler无缝配合,以下是具体实现步骤:

1. 配置左侧可拖拽工单卡片

用TelerikDragDropZone包裹左侧卡片,绑定工单数据并设置拖拽模式:

<TelerikDragDropZone Data="@WorkOrders" DragMode="DragMode.Auto">
    <Template>
        @foreach (var workOrder in context)
        {
            <div class="work-order-card" @key="workOrder.Id">
                <h4>@workOrder.Title</h4>
                <p>@workOrder.Description</p>
            </div>
        }
    </Template>
</TelerikDragDropZone>

后台定义工单模型:

public class WorkOrder
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public TimeSpan Duration { get; set; } = TimeSpan.FromHours(1); // 默认工单时长
}

2. 将Scheduler配置为可放置区域

在Scheduler内部嵌套TelerikDropZone,监听OnDrop事件处理拖拽数据:

<TelerikScheduler @bind-Data="@SchedulerEvents"
                  StartTime="@new DateTime(2024, 1, 1, 8, 0, 0)"
                  EndTime="@new DateTime(2024, 1, 1, 18, 0, 0)"
                  View="SchedulerViewType.Day">
    <SchedulerViews>
        <SchedulerDayView></SchedulerDayView>
    </SchedulerViews>
    <TelerikDropZone OnDrop="@OnWorkOrderDropped">
        <ChildContent>
            <SchedulerToolbar>
                <SchedulerToolbarItem Command="SchedulerToolbarCommand.Today"></SchedulerToolbarItem>
            </SchedulerToolbar>
        </ChildContent>
    </TelerikDropZone>
</TelerikScheduler>

3. 处理拖拽放置逻辑

在OnWorkOrderDropped事件中,将拖拽的工单转换为Scheduler日程事件:

private void OnWorkOrderDropped(DropEventArgs args)
{
    if (args.DragData is WorkOrder droppedWorkOrder && args.DropTargetInfo is SchedulerDropTargetInfo dropInfo)
    {
        var newEvent = new SchedulerEvent
        {
            Id = Guid.NewGuid(),
            Title = droppedWorkOrder.Title,
            Description = droppedWorkOrder.Description,
            Start = dropInfo.DateTime,
            End = dropInfo.DateTime.Add(droppedWorkOrder.Duration)
        };
        SchedulerEvents.Add(newEvent);
        StateHasChanged();
    }
}

注:SchedulerEvent需包含Telerik Scheduler要求的核心字段:Id、Title、Start、End。


二、自定义HTML5拖拽实现(不依赖Telerik组件)

如果不想依赖Telerik的DragDrop组件,可直接使用HTML5原生拖拽API:

1. 设置左侧卡片为可拖拽对象

给卡片添加draggable="true"属性,监听ondragstart保存拖拽数据:

@foreach (var workOrder in WorkOrders)
{
    <div class="work-order-card" 
         draggable="true" 
         @ondragstart="(() => OnDragStart(workOrder))"
         @key="workOrder.Id">
        <h4>@workOrder.Title</h4>
        <p>@workOrder.Description</p>
    </div>
}

后台处理拖拽开始事件:

private WorkOrder DragDropData { get; set; }

private void OnDragStart(WorkOrder workOrder)
{
    DragDropData = workOrder;
}

2. 配置Scheduler时段为可放置区域

通过TimeSlotTemplate给每个时段添加拖拽事件监听:

<TelerikScheduler @bind-Data="@SchedulerEvents"
                  StartTime="@new DateTime(2024, 1, 1, 8, 0, 0)"
                  EndTime="@new DateTime(2024, 1, 1, 18, 0, 0)"
                  View="SchedulerViewType.Day">
    <SchedulerViews>
        <SchedulerDayView>
            <TimeSlotTemplate>
                <div class="time-slot"
                     @ondragover="OnDragOver"
                     @ondrop="(() => OnDrop(context.Start))">
                    @context.Start.ToShortTimeString()
                </div>
            </TimeSlotTemplate>
        </SchedulerDayView>
    </SchedulerViews>
</TelerikScheduler>

3. 处理拖拽核心逻辑

  • 阻止拖拽默认行为,允许放置:
private void OnDragOver(DragEventArgs args)
{
    args.PreventDefault();
}
  • 完成放置,创建新的Scheduler事件:
private void OnDrop(DateTime targetTime)
{
    if (DragDropData != null)
    {
        var newEvent = new SchedulerEvent
        {
            Id = Guid.NewGuid(),
            Title = DragDropData.Title,
            Description = DragDropData.Description,
            Start = targetTime,
            End = targetTime.Add(DragDropData.Duration)
        };
        SchedulerEvents.Add(newEvent);
        DragDropData = null;
        StateHasChanged();
    }
}

4. 添加交互样式

增强拖拽时的视觉反馈:

.work-order-card {
    padding: 1rem;
    border: 1px solid #ccc;
    margin: 0.5rem 0;
    cursor: grab;
}

.time-slot.drop-over {
    background-color: #e8f4f8;
}

可在ondragover时给时段添加drop-over类,ondragleave时移除,提升交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:25:20