ListBox ObservableCollection дублирует - PullRequest
       5

ListBox ObservableCollection дублирует

0 голосов
/ 18 августа 2011

У меня есть приложение WPF, у которого есть список, связанный с ObservableCollection, который извлекает его данные из базы данных.Я пытаюсь обновлять данные ListBox каждую минуту с помощью DispatcherTimer.

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

У меня есть два классадля коллекции следующим образом (я очень новичок в 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 только новыми данными или изменениями данных из таблицы?

Я действительно изо всех сил пытаюсь понять, где я иду не так, и что нужно добавить / удалить, чтобы это работало.

Если есть какие-либо данные, которые мне не хватает, пожалуйста, дайте мне знать.

Мэтт

1 Ответ

1 голос
/ 18 августа 2011

Либо вы очищаете все данные в списке перед тем, как добавить их снова, либо проверяете коллекцию.Я полагаю, ваш eID является первичным ключом?сделать что-то вроде этого:

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

C # код, но он показывает идею

Преобразователь developerFusion сделал этот VB:

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