【发布时间】:2011-10-29 17:09:35
【问题描述】:
我有一个 WPF 应用程序,它有一个绑定到 ObservableCollection 的列表框,它从数据库中检索它的数据。我正在尝试通过使用 DispatcherTimer 每分钟刷新一次 ListBox 数据。
Dim dispatcherTimer As DispatcherTimer = New System.Windows.Threading.DispatcherTimer
AddHandler dispatcherTimer.Tick, AddressOf getRoomMeetingDetails
dispatcherTimer.Interval = New TimeSpan(0, 2, 0)
dispatcherTimer.Start()
调用getRoomMeetingDetails方法如下。
Public Sub getRoomMeetingDetails()
If Not My.Settings.rbConn = Nothing And _
Not gl_rmName = Nothing Then
Dim sqlConn As New SqlConnection(My.Settings.rbConn)
Dim sqlquery As String = "SELECT *" & _
"FROM table " & _
Dim sqlCmd As New SqlCommand(sqlquery, sqlConn)
sqlConn.Open()
Dim dr As SqlDataReader
dr = sqlCmd.ExecuteReader
While dr.Read
roomMeetingList.Add(New meetingDetails() With {.eMeetingId = dr.Item("dId")})
End While
End If
End Sub
然后,我有两个 Collection 类,如下所示(我对 ObservableCollections 非常陌生,并且已尽我所能从 MSDN 示例中对我的代码进行建模,因此,如果这不是实现我的目标的最佳方法我正在努力实现,或者可以做得更容易,请告诉我)
Public Class MeetingList
Inherits ObservableCollection(Of meetingDetails)
Private Shared list As New MeetingList
Public Shared Function getList() As MeetingList
Return list
End Function
Private Sub New()
AddItems()
End Sub
Public Shared Sub reset(ByVal rmName As String)
list.ClearItems()
list.AddItems()
End Sub
Private Sub AddItems()
End Sub
End Class
Public Class meetingDetails
Implements INotifyPropertyChanged
Public Sub New()
End Sub
Public Property eID() As String
Get
Return _eID
End Get
Set(ByVal value As String)
_eID = value
OnPropertyChanged("eID")
End Set
End Property
Private _eID As String
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
End Class
当每分钟调用 DispatcherTimer 时,ListBox 数据被复制,我认为这是因为 getRoomMeetingDetails 方法在每个刻度上添加所有 SQL 结果。如何仅使用表中的新数据或数据更改来刷新 ListBox?
我真的很难弄清楚我哪里出错了,以及需要添加/删除什么才能使其正常工作。
如果有任何我遗漏的细节,请告诉我。
马特
【问题讨论】:
标签: wpf vb.net .net-3.5 observablecollection