Wörterbuch an GridView binden
Bezugnehmend auf diesen Thread:Algorithmus zum Zählen der Zeit, die im selben Zeitraum verstrichen ist, wie binde ich das Wörterbuch an das GridView? Bitte werfen Sie einen Blick auf die Antwort.
Ich habe versucht, ein GridView und dann auf den Code-Behind hinzuzufügen:GV.DataSource = timeRangeCounts
und binde es, aber im Gegenzug:
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.
Wie kann ich das machen? Bitte sehen Sie sich den folgenden Code an:
Die erste Helferklasse wird verwendet, um die Anzahl der genauen Übereinstimmungen und Übereinstimmungen im Unterbereich zu speichern:
<code>Public Class TimeRangeCounter Property ExactRangeMatch as Integer Property SubRangeMatch as Integer End Class </code>
Die zweite Hilfsklasse wird verwendet, um dem Wörterbuch mitzuteilen, wie ein Schlüssel (vom TypTimeRange
) unterscheidet sich von anderen:
<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>
Die dritte Hilfsklasse speichert die Start- und Endzeiten eines Bereichs:
<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>
Wenn wir also das Obige verwenden, sollten wir in der Lage sein, diesen Algorithmus zu schreiben:
<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>
Der 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>
Dann habe ich versucht, es auszuführen, aber das Ergebnis ist wie folgt:
<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>
Was ist los mit dem Code?