【问题标题】:Bind Dictionary to GridView将字典绑定到 GridView
【发布时间】:2012-05-09 18:53:06
【问题描述】:

参考这个帖子:Algorithm to count the time that occured on the same period,如何将字典绑定到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

第二个辅助类用于帮助字典了解一个键(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

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

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

所以使用上面我们应该可以写出这个算法:

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

网格视图:

<asp:GridView ID="GV" runat="server">
    <Columns>
        <asp:BoundField DataField="Key" HeaderText="Dictionary Key" />
        <asp:BoundField DataField="Value" HeaderText="Dictionary Value" />
    </Columns>
</asp:GridView>

然后我尝试运行它,但结果是这样的:

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
...               ...

代码有什么问题?

【问题讨论】:

  • 请出示您的 Gridview 的代码,谢谢!
  • @Brian Webster:抱歉回复晚了。我添加了它。请看一看。它得到了结果,但 Dictionary Value 没有返回任何值,它只返回 TimeRangeCounter
  • 添加ToString() 是否有帮助?

标签: asp.net vb.net data-binding gridview dictionary


【解决方案1】:

这是一个网格视图

    <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>

这是将字典绑定到该 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

这是输出

如果我的值属于“MyClass”类型怎么办?

Gridview 将针对每个“值”单元格执行MyClassToString 函数。

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

Public Class TimeRangeCounter
    Property ExactRangeMatch as Integer
    Property SubRangeMatch as Integer
End Class

这是必要的,因为您的“价值”是时间TimeRangeCounter

总结

作者的代码有两个问题。

  • 问题 1 产生了一个实际错误,按照我的代码示例解决了
  • 问题 2 是 Gridview 的“值”列中使用的自定义类缺少 ToString 函数

【讨论】:

  • 我试图将字典分配给 GridView,但它仍然返回消息。请看看stackoverflow.com/questions/9975788/… .. 谢谢:)
  • 请编辑您的问题以包含您的确切代码。关于我应该查看哪些代码,您链接中的问题和答案有点模棱两可。我发布的这段代码有效。此外,最好将关于 SO 的问题/答案设置为不同的工作单元,这样路人就不必去寻找了解所问内容所需的信息。
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 2011-02-28
  • 2011-09-09
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多