问题描述
限时送ChatGPT账号..参考此线程:算法统计同一时期发生的时间,如何将字典绑定到GridView?请看一下答案.
Referring to this thread: Algorithm to count the time that occured on the same period, how to bind the dictionary to the GridView? Pls take a look to the answer.
我尝试添加一个 GridView,然后在代码隐藏上:GV.DataSource = timeRangeCounts
并绑定它,但作为回报:
I tried to add a GridView and then on the code-behind: GV.DataSource = timeRangeCounts
and bind it, but in return:
id 为GV"的 GridView 的数据源没有任何可用于生成列的属性或属性.确保您的数据源有内容.
我该怎么做?请看下面的代码:
How can I do that? Please take a look at the code below:
第一个辅助类用于保存精确和子范围匹配的计数:
The first helper class is used to hold the counts of exact and sub range matches:
Public Class TimeRangeCounter
Property ExactRangeMatch as Integer
Property SubRangeMatch as Integer
End Class
第二个辅助类用于帮助字典了解一个键(TimeRange
类型)与另一个键的区别:
The second helper class is used to help the dictionary know how one key (of type TimeRange
) differs from another:
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
第三个辅助类存储一个范围的开始和结束时间:
The Third helper class stores the start and end times of a range:
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
所以使用上面的我们应该可以写出这个算法:
So using the above we should be able to write this algorithm:
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>
然后我尝试运行它,但结果如下:
Then I tried to run it but the result is like:
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
<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 将根据值"单元格执行 MyClass
的 ToString
函数.
The Gridview will execute the ToString
function of MyClass
, per "Value" cell.
在您的示例中,覆盖此类上的 ToString
函数
In your example, Override the ToString
function on this class
Public Class TimeRangeCounter
Property ExactRangeMatch as Integer
Property SubRangeMatch as Integer
End Class
这是必要的,因为您的值"是时间TimeRangeCounter
This is necessary because your "Value" is of time TimeRangeCounter
总结
作者的代码有两个问题.
The Author's code had two problems.
问题 1 产生了实际错误,并按照我的代码示例解决了问题 2 是 Gridview 的值"列中使用的自定义类缺少 ToString 函数这篇关于将字典绑定到 GridView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论