我目前正在使用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>
更新了我所做的,但仍然没有显示 谢谢你的帮助
答案 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