<VB> Подсветка выбранных дат из базы данных в элементе управления Calendar - PullRequest
0 голосов
/ 04 августа 2011

Я сейчас использую VB. Я хочу сделать элемент управления календаря, в котором даты выделены / выбраны. Все эти даты получены из базы данных.

Первое, что мне нужно знать, это как поместить все даты в массив Второе, что мне нужно знать, это как выделить все даты в массиве.

Я провел некоторые исследования в интернете, и они кое-что сказали о выбранных датах, коллекции выбранных дат и дренере. Но, честно говоря, я не могу найти какие-либо коды 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 ]

2 голосов
/ 04 августа 2011

Предположим, у вас есть 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 
2 голосов
/ 04 августа 2011

Что касается второй части вашего вопроса, вы можете увидеть в этом посте , как выделить указанные дни, хотя и с использованием синтаксиса 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)

Toполучить из вашего устройства чтения данных в массив (хотя я не уверен, что вам нужно массив) я бы сделал следующее:

' 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()
...