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

VB.NET Calendar控件绑定数据库数据时报BC30451错误求助

问题排查与解决

报错BC30451: 'SelectedData' is not declared的核心原因是编译器无法识别代码中调用的成员,结合你提供的代码,所有问题和修复方案如下:

1 拼写错误(核心触发原因)

你的代码存在多处拼写错误,直接导致方法、参数、事件绑定失效:

  • Calendar1_DayRender方法参数写法错误:ByVal e Ad DayRenderEventArsgs 应为 ByVal e As DayRenderEventArgs,关键词As拼写错误,EventArgs被误写为EventArsgs
  • 选择变更事件定义错误:Protect Sub Calendar1_SelectinChanged 应为 Protected Sub Calendar1_SelectionChanged,访问修饰符Protected少了后缀ed,事件名SelectionChanged少了字母o
  • 全局排查是否存在把SelectedDate误写为SelectedData的代码,你的报错信息明确指向SelectedData未声明,绝大多数情况是属性名拼写错误导致

2 逻辑调用问题

  • 你在DayRender事件里直接使用全局变量datatable,如果没有提前调用GetData方法赋值,datatable会是空引用引发报错,需要在Page_Load事件中先调用GetData给全局变量赋值
  • 同一天如果存在多条事件,你的Label定义在循环外只会显示最后一条,需要把Label实例化放到判断逻辑内部
  • 数据库连接用完后需要主动关闭,避免连接泄漏

3 前端控件有效性检查

确认.aspx页面中的Calendar控件配置正确,必须包含runat="server"且ID与后台一致,同时绑定对应事件:

<asp:Calendar ID="Calendar1" runat="server" OnDayRender="Calendar1_DayRender" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar>

修正后完整代码

' 全局变量声明(如果此前没有定义请补充)
Private conn As New SqlClient.SqlConnection()
Private constr As New SqlClient.SqlConnectionStringBuilder()
Private strquery As String
Private _SqlDataAdapter As SqlClient.SqlDataAdapter
Private datatable As Data.DataTable

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        datatable = GetData()
    End If
End Sub

Protected Function GetData() As Data.DataTable
    If conn.State = ConnectionState.Closed Then
        conn.ConnectionString = constr.ToString()
        conn.Open()
    End If

    strquery = "SELECT * FROM Event"
    _SqlDataAdapter = New SqlClient.SqlDataAdapter(strquery, conn)
    datatable = New Data.DataTable()
    _SqlDataAdapter.Fill(datatable)
    conn.Close() ' 用完关闭数据库连接
    Return datatable
End Function

Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As DayRenderEventArgs) Handles Calendar1.DayRender
    Dim dt As Data.DataTable = datatable
    e.Day.IsSelectable = False
    For Each row As Data.DataRow In dt.Rows
        If e.Day.Date = Convert.ToDateTime(row("eventDate")) Then
            e.Cell.Controls.Add(New Label With {.Text = "<br/>"})
            ' 每次匹配到事件都新建Label实例,避免覆盖
            Dim lblEvent = New Label()
            lblEvent.Text = row("event_desc").ToString()
            lblEvent.Attributes.Add("style", "background-color: #01a9ac;border: #01a9ac;color: #fff;padding: 3px;padding-left: 50px;padding-right: 50px;")
            e.Cell.Controls.Add(lblEvent)
        End If
    Next
End Sub

Protected Sub Calendar1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Calendar1.SelectionChanged
    Dim strdatenow As String
    Dim dateTimenow = DateTime.Now()
    Dim nowDate = dateTimenow.Date
    Calendar1.SelectedDate = nowDate
    strdatenow = Calendar1.SelectedDate.ToString()
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:03