Enlazar Diccionario a GridView
Refiriéndose a este hilo:Algoritmo para contar el tiempo que ocurrió en el mismo período., ¿cómo enlazar el diccionario al GridView? Por favor, eche un vistazo a la respuesta.
Intenté agregar un GridView y luego en el código subyacente:GV.DataSource = timeRangeCounts
y atarlo, pero a cambio:
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.
¿Cómo puedo hacer eso? Por favor, eche un vistazo al siguiente código:
La primera clase auxiliar se utiliza para mantener los recuentos de coincidencias exactas y de rango secundario:
<code>Public Class TimeRangeCounter Property ExactRangeMatch as Integer Property SubRangeMatch as Integer End Class </code>
La segunda clase de ayuda se usa para ayudar al diccionario a saber cómo una tecla (de tipoTimeRange
) difiere de otro:
<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>
La tercera clase de ayudante almacena los tiempos de inicio y finalización de un rango:
<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>
Así que usando lo anterior deberíamos poder escribir 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>
La vista de cuadrícula:
<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>
Luego intenté ejecutarlo pero el resultado es 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>
¿Qué hay de malo con el código?