Vincular Dicionário ao GridView
Referindo-se a este segmento:Algoritmo para contar o tempo que ocorreu no mesmo período, como ligar o dicionário para o GridView? Pls dá uma olhada na resposta.
Eu tentei adicionar um GridView e, em seguida, no code-behind:GV.DataSource = timeRangeCounts
e ligá-lo, mas em troca:
The data source for GridView with id 'GV' did not have any properties or attributes from which to generate columns. Ensure that your data source has content.
Como eu posso fazer isso? Por favor, dê uma olhada no código abaixo:
A primeira classe auxiliar é usada para manter as contagens de correspondências exatas e subintervalo:
<code>Public Class TimeRangeCounter Property ExactRangeMatch as Integer Property SubRangeMatch as Integer End Class </code>
A segunda classe auxiliar é usada para ajudar o dicionário a saber como uma chave (do tipoTimeRange
) difere de outro:
<code>Public Class TimeRangeEqualityComparer Implements IEqualityComparer(Of TimeRange) Public Overloads Function Equals(left As TimeRange, right As TimeRange) _ As Boolean Implements IEqualityComparer(Of TimeRange).Equals Return left.ToString = right.ToString End Function Public Overloads Function GetHashCode(range As TimeRange) _ As Integer Implements IEqualityComparer(Of TimeRange).GetHashCode return range.ToString().GetHashCode() End Function End Class </code>
A terceira classe auxiliar armazena os horários de início e término de um intervalo:
<code>Public Class TimeRange Private readonly _start Private readonly _end Public Readonly Property Start Get return _start End Get End Property Public Readonly Property [End] Get return _end End Get End Property Public Sub New(start As String, [end] As string) Me._start = start Me._end = [end] End Sub Public Overrides Function ToString() as String Return String.Format("{0}-{1}", Start, [End]) End Function End Class </code>
Então, usando o acima, devemos ser capazes de escrever este algoritmo:
<code>Dim columnLength As Integer = 5 Dim timeStart() As String = {"08.00", "08.00", "10.00", "08.00", "08.00"} Dim timeEnd() As String = {"08.50", "11.50", "11.00", "09.00", "08.50"} Dim comparer As New TimeRangeEqualityComparer() Dim timeRangeCounts As New Dictionary(Of TimeRange, TimeRangeCounter)(comparer) 'Count exact range matches while building dictionary For i = 0 to columnLength - 1 Dim key As TimeRange = New TimeRange(timeStart(i), timeEnd(i)) If timeRangeCounts.ContainsKey(key) timeRangeCounts(key).ExactRangeMatch += 1 Else Dim counter = New TimeRangeCounter() counter.ExactRangeMatch = 1 timeRangeCounts(key) = counter End If Next 'Count sub ranges For Each kvp in timeRangeCounts For Each key in timeRangeCounts.Keys If kvp.key.Start >= key.Start AndAlso _ kvp.Key.End <= key.End AndAlso _ kvp.key.ToString <> key.ToString then kvp.Value.SubRangeMatch += 1 End If Next Next 'Console.WriteLine(timeRangeCounts) GV.DataSource = timeRangeCounts GV.DataBind() </code>
O gridview:
<code><asp:GridView ID="GV" runat="server"> <Columns> <asp:BoundField DataField="Key" HeaderText="Dictionary Key" /> <asp:BoundField DataField="Value" HeaderText="Dictionary Value" /> </Columns> </asp:GridView> </code>
Então eu tentei executá-lo, mas o resultado é como:
<code>Dictionary Key Dictionary Value 08:00:00-08:50:00 TimeRangeCounter 08:00:00-09:40:00 TimeRangeCounter 10:00:00-11:40:00 TimeRangeCounter ... ... </code>
O que há de errado com o código?