<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()
Другие вопросы по тегам