开发者

ListBox ObservableCollection duplicating

开发者 https://www.devze.com 2023-03-29 03:38 出处:网络
I have a WPF application which has a listbox bound to an ObservableCollection which retrieves it\'s data from a Database.I am attempting to have the ListBox data refreshed every minute through the use

I have a WPF application which has a listbox bound to an ObservableCollection which retrieves it's data from a Database. I am attempting to have the ListBox data refreshed every minute through the use of a DispatcherTimer.

Dim dispatcherTimer As DispatcherTimer = New System.Windows.Threading.DispatcherTimer
AddHandler dispatcherTimer.Tick, AddressOf getRoomMeetingDetails
dispatcherTimer.Interval = New TimeSpan(0, 2, 0)
dispatcherTimer.Start()

Which calls the getRoomMeetingDetails method as follows.

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

I then have my two classes for the Collection as follows (I am very new to ObservableCollections and have tried my best to model my code off the MSDN examples, so if this isn't the best method to use to achieve what I am trying to achieve, or can be done easier, please let me know)

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

What is happening is when the DispatcherTimer is called every minute, the ListBox data is duplicated which I believe is because the getRoomMeetingDetails method is adding all of the SQL results on every tick. How can I refresh the ListBox with only new data or data changes from the table?

I am really struggling to work out where I am going wrong and what needs to be added/removed for this to work.

If there is any details I am missing please let me know.

Matt


Either you clear all the data in the listbox before adding them again or you do a check on the collection. I assume your eID is the primary key? the do something like this:

if ( roomMeetingList.Where ( entry => entry.eID == dbID ).Count () == 0 ) {
    // add
}

C# code, but it shows the idea

developerFusion's convert made this VB:

If roomMeetingList.Where(Function(entry) entry.eID = dbID).Count() = 0 Then
     ' Add
End If
0

精彩评论

暂无评论...
验证码 换一张
取 消