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
相关产品推荐
相关产品推荐

