2012-04-30 121 views
3

参照此线程:Algorithm to count the time that occured on the same period,如何将字典绑定到GridView?请看看答案。将字典绑定到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() 

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> 

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

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

代码有什么问题?

+0

请为您的Gridview显示代码,谢谢! –

+0

@布莱恩韦伯斯特:对不起,回复晚了。我添加了它。请看看。它得到了结果,但Dictionary Value没有返回任何值,它只返回'TimeRangeCounter'。 –

+0

请参阅我的编辑,请 –

回答

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> 

这里是代码绑定字典到的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 

这里是输出

enter image description here

如果我的某些类型的“MyClass?”的值如何?

Gridview将根据“值”单元执行MyClassToString函数。

在你的榜样,重写ToString功能上该类

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

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

摘要

笔者的代码有两个问题。

  • 问题1是产生实际误差,并通过下面的我的代码示例
  • 问题2解决是缺乏用于在将GridView
“值”列中使用的自定义类一个ToString函数的
+0

我试图将Dictionary分配给GridView,但它仍然返回消息。请看看http://stackoverflow.com/questions/9975788/algorithm-to-count-the-time-that-occured-on-the-same-period ..谢谢:) –

+0

请编辑您的问题,包括你的确切代码。链接中的问题和答案对于我应该查看的代码有点模糊。我已发布的这段代码有效。此外,对于SO的问题/回答也是很好的,因为这些路人不必去追查需要了解所要求的信息。 –

+0

我编辑了上面的代码。请看看:) –