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

如何将DayPilotCalendar点击事件的值传递给ListView的SelectMethod?

实现DayPilotCalendar点击事件联动ListView显示关联学科详情

当然可以实现!思路和你用下拉列表的方式类似,只是需要把日历点击事件中获取的EventID临时存储起来,再传递给ListView的SelectMethod。下面是具体的实现步骤和代码:

第一步:修正模型关联(重要)

首先我注意到你的Event类里有个小错误,外键关联的写法不对,应该改成这样(确保EF能正确识别表之间的关联):

public class Event
{
    public int EventID { get; set; }
    public string EventName { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    public string Notes { get; set; }
    // 外键:关联Subject表的SubjectID
    public int SubjectID { get; set; }
    // 可选导航属性,方便EF进行关联查询
    public virtual Subject Subject { get; set; }
}

Subject类的代码是正确的,不用修改。

第二步:添加存储选中EventID的中间控件

在页面上添加一个隐藏字段,用来保存点击事件时获取的EventID(回发时这个值会被保留):

<asp:HiddenField ID="hfSelectedEventID" runat="server" />

第三步:处理DayPilotCalendar的EventClick事件

在点击日历事件时,获取事件ID并存储到隐藏字段,然后触发ListView重新绑定数据:

protected void DayPilotCalendar1_EventClick(object sender, DayPilot.Web.Ui.Events.EventClickEventArgs e)
{
    // 从事件参数中获取EventID(e.Value对应你设置的DataValueField="EventID")
    int selectedEventId = int.Parse(e.Value);
    // 把ID存到隐藏字段
    hfSelectedEventID.Value = selectedEventId.ToString();
    // 强制ListView重新加载数据
    ListView1.DataBind();
}

第四步:修改ListView的SelectMethod

使用[Control]特性绑定到隐藏字段,通过EventID找到关联的Subject:

public IQueryable<Subject> GetEventDetails([Control("hfSelectedEventID")] int? selectedEventId)
{
    var _db = new School.Models.SchoolContext();

    // 处理未选中事件的情况,返回空结果
    if (!selectedEventId.HasValue)
    {
        return Enumerable.Empty<Subject>().AsQueryable();
    }

    // 通过Event关联查询对应的Subject
    // 这里用EF的关联查询,确保能拿到正确的学科数据
    var subjectQuery = from ev in _db.Events
                       join sub in _db.Subjects on ev.SubjectID equals sub.SubjectID
                       where ev.EventID == selectedEventId.Value
                       select sub;

    return subjectQuery;
}

第五步:配置ListView的显示模板

最后给ListView添加显示模板,用来展示学科详情:

<asp:ListView ID="ListView1" runat="server" SelectMethod="GetEventDetails">
    <ItemTemplate>
        <div class="event-detail">
            <h4>学科名称:<%# Eval("SubjectName") %></h4>
            <p>教室:<%# Eval("SubjectRoom") %></p>
        </div>
    </ItemTemplate>
    <EmptyDataTemplate>
        <p>请点击日历上的事件查看关联学科详情</p>
    </EmptyDataTemplate>
</asp:ListView>

为什么这样可行?

当你点击日历事件时,页面会回发:

  1. 先执行DayPilotCalendar1_EventClick方法,把选中的EventID存入隐藏字段;
  2. 调用ListView1.DataBind()后,会触发GetEventDetails方法;
  3. GetEventDetails通过[Control]特性读取隐藏字段里的EventID,查询对应的学科数据并返回给ListView展示。

这样就完美实现了你想要的点击日历事件显示关联学科详情的功能!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:34