<vb>在Calendar控件</vb>中突出显示数据库中的选定日期

时间:2011-08-04 09:16:48

标签: vb.net date calendar-control

我目前正在使用VB。我想做一个日历控件,其中突出显示/选择日期。所有这些日期都从数据库中检索。

我需要知道的第一件事是如何将所有日期放入数组中 我需要知道的第二件事是如何突出显示数组中的所有日期。

我在互联网上做了一些研究,他们说了一些关于selectedDates和selectedDates收集和投降的事情。但坦率地说,我真的找不到任何与此相关的VB代码。日期格式为dd / MM / yyyy

    Imports System.Data.SqlClient

    Partial Class _Default
Inherits System.Web.UI.Page

Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Dim connectionString As String = ConfigurationManager.ConnectionStrings("CleanOneConnectionString").ConnectionString
    Dim connection As SqlConnection = New SqlConnection(connectionString)
    connection.Open()
    Dim sql As String = "Select schedule From OrderDetails Where schedule is not null"
    Dim command As SqlCommand = New SqlCommand(sql, connection)
    Dim reader As SqlDataReader = command.ExecuteReader()
    If (reader.Read()) Then
        If (reader.HasRows) Then
            While reader.Read()
                myCalendar.SelectedDates.Add(CType(reader.GetDateTime(0), Date))
            End While
        End If
    End If
    reader.Close()
    connection.Close()
    myCalendar.SelectedDayStyle.BackColor = System.Drawing.Color.Red
End Sub
    End Class

我的日历

    <asp:Calendar ID="myCalendar" runat="server" ShowGridLines="True">
</asp:Calendar>

更新了我所做的,但仍然没有显示 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

对于问题的第二部分,您可以在this post上看到如何突出显示指定日期,尽管使用C#语法。

我将假设现在正在使用L2S格式来获取日期(如果您需要更好的细节,请在实际实施时发表评论)。

我建议您将选择的日期保存在表单上的变量中(而不是作用于该函数),以防止每天呈现数据库查询。考虑到这一点,这里有一些示例代码(免费,所以请原谅和评论基本/麻烦的语法问题):

Private DatesToHighlight As IEnumerable(Of Date)

' implementation details provided so commented this bit out, see EDIT below
'Protected Sub PopulateDatesToHighlight()
'    DatesToHighlight = db.SomeTable.Select(Function(n) n.MyDateField)
'End Sub

Protected Sub DayRenderer(ByVal object As Sender, ByVal e As DayRenderEventArgs)
   If DatesToHighlight.Contains(e.Day.Date) Then
       e.Cell.BackColor = System.Drawing.Color.Red
   End If
End Sub

根据我链接的问题中的说明,您需要更改日历控件的标记,以提供ondayrender

ondayrender="DayRenderer"参数

关于将日期更改为数组,它取决于它们在开始时的格式。如果在从IEnumerable继承的任何内容中,您可以使用ToArray()。如果它们只是变量,则可以使用日期

初始化数组
Dim myDates() As Date = {dateVar1, dateVar2}

希望有帮助吗?

编辑:(响应OP增加的代码)

要从数据读取器到数组(虽然我不相信你需要一个数组),我会做以下事情:

' using the variable I declared earlier
DatesToHighlight = New IEnumerable(Of Date)
If reader.HasRows Then
    Dim parsedDate As Date
    While reader.Read()
        If Date.TryParse(reader(0), parsedDate) Then
            DatesToHighlight.Add(parsedDate)
        End If
    End While
End If

Dim myArrayOfDates() As Date = DatesToHighlight.ToArray()

答案 1 :(得分:2)

假设您有一个名为myDates的DataTable,以及一个名为myCalendar的Calendar控件:

For i As Int = 0 To myDates.Rows.Count - 1
    myCalendar.SelectedDates.Add(CType(myDates.Row(i)(0), Date)
Next

您可以在标记中声明突出显示:

<asp:Calendar ID="myCalendar" runat="server">
    <SelectedDayStyle BackColor="red" />
</asp:Calendar>

或以编程方式:

myCalendar.SelectedDayStyle.BackColor = System.Drawing.Color.Red

更新SqlDataReader(这次是VB.NET)

If reader.HasRows Then
    While reader.Read()
        myCalendar.SelectedDates.Add(CType(reader(0), Date)
    End While
End If

根据OP代码更新

代码运行时是否出现任何错误?如果正在读取的列不是DateTime列,SqlDataReader.GetDateTime将抛出InvalidCastException

我想知道这是否是格式问题?您可以验证数据库中列的数据类型,以及日期存储的格式吗?

我已经用一些建议修改了你的代码。

Imports System.Data.SqlClient

Partial Class _Default Inherits System.Web.UI.Page  

    Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

        Dim connectionString As String = ConfigurationManager.ConnectionStrings("CleanOneConnectionString").ConnectionString

        ' Using blocks will automatically dispose of the object, and are 
        ' pretty standard for database connections
        Using connection As New SqlConnection(connectionString)
            connection.Open()     
            Dim sql As String = "Select schedule From OrderDetails Where schedule is not null"
            Dim command As SqlCommand = New SqlCommand(sql, connection)     
            Dim reader As SqlDataReader = command.ExecuteReader() 

            ' This is not needed - in fact, this line will "throw away"
            ' the first row in the row collection
            'If (reader.Read()) Then

            If (reader.HasRows) Then             
                While reader.Read()
                    myCalendar.SelectedDates.Add(CType(reader.GetDateTime(0), Date))              End While         
            End If

            reader.Close()     

            ' Not needed because of the Using block
            'connection.Close()     
        End Using

        myCalendar.SelectedDayStyle.BackColor = System.Drawing.Color.Red 
    End Sub     
End Class