<VB> Подсветка выбранных дат из базы данных в элементе управления Calendar
Я в настоящее время использую VB. Я хочу сделать элемент управления календаря, в котором даты выделены / выбраны. Все эти даты получены из базы данных.
Первое, что мне нужно знать, это как поместить все даты в массив. Второе, что мне нужно знать, это как выделить все даты в массиве.
Я провел некоторые исследования в Интернете, и они сказали что-то о selectedDates и selectedDates collection и dayrender. Но, честно говоря, я не могу найти какие-либо коды VB по этому поводу. Формат даты будет в дд / мм / гггг
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 ответа
Предположим, у вас есть DataTable
названный myDates, и Calendar
элемент управления с именем myCalendar:
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
ОБНОВЛЕНИЕ на основе кода ОП
Получаете ли вы какие-либо ошибки при запуске кода? SqlDataReader.GetDateTime
бросит InvalidCastException
если читаемый столбец не является столбцом DateTime.
Мне интересно, если это проблема формата? Можете ли вы проверить тип данных столбца в базе данных, а также формат, в котором хранится дата?
Я немного изменил ваш код с парой предложений.
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
Что касается второй части вашего вопроса, вы можете увидеть в этом посте, как выделить определенные дни, хотя и с использованием синтаксиса 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()