将字典绑定到GridView

mrj*_*_05 3 vb.net asp.net data-binding gridview dictionary

参考这个线程:计算在同一时期发生的时间的算法,如何将字典绑定到GridView?请看看答案.

我试图添加一个GridView,然后添加代码隐藏:GV.DataSource = timeRangeCounts并绑定它,但作为回报:

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.

我怎样才能做到这一点?请看下面的代码:


第一个辅助类用于保存精确匹配和子范围匹配的计数:

Public Class TimeRangeCounter
    Property ExactRangeMatch as Integer
    Property SubRangeMatch as Integer
End Class
Run Code Online (Sandbox Code Playgroud)

第二个辅助类用于帮助字典知道一个键(类型TimeRange)与另一个键的不同之处:

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
Run Code Online (Sandbox Code Playgroud)

第三个辅助类存储范围的开始和结束时间:

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
Run Code Online (Sandbox Code Playgroud)

所以使用上面我们应该能够编写这个算法:

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()
Run Code Online (Sandbox Code Playgroud)

gridview:

<asp:GridView ID="GV" runat="server">
    <Columns>
        <asp:BoundField DataField="Key" HeaderText="Dictionary Key" />
        <asp:BoundField DataField="Value" HeaderText="Dictionary Value" />
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

然后我试着运行它但结果如下:

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
...               ...
Run Code Online (Sandbox Code Playgroud)

代码有什么问题?

Bri*_*ter 5

这是一个Gridview

    <asp:GridView ID="GV" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Key" HeaderText="Dictionary Key" />
            <asp:BoundField DataField="Value" HeaderText="Dictionary Value" />
        </Columns>
    </asp:GridView>
Run Code Online (Sandbox Code Playgroud)

这是将字典绑定到Gridview的代码

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim D As New Dictionary(Of Integer, String)
    D.Add(1, "One")
    D.Add(2, "Two")
    D.Add(3, "Three")
    GV.DataSource = D
    GV.DataBind()
End Sub
Run Code Online (Sandbox Code Playgroud)

这是输出

在此输入图像描述

如果我的某些类型的价值"MyClass?"怎么办?

Gridview将根据"Value"单元执行ToString函数MyClass.

在您的示例中,覆盖ToString此类的函数

Public Class TimeRangeCounter
    Property ExactRangeMatch as Integer
    Property SubRangeMatch as Integer
End Class
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为你的"价值"是时间 TimeRangeCounter

摘要

作者的代码有两个问题.

  • 问题1产生了一个实际错误,并通过我的代码示例解决了
  • 问题2是Gridview的"Value"列中使用的自定义类缺少ToString函数