2011-08-18 2 views
0

데이터베이스에서 데이터를 가져 오는 ObservableCollection에 바인딩 된 목록 상자가있는 WPF 응용 프로그램이 있습니다. DispatcherTimer를 사용하여 매분마다 ListBox 데이터를 새로 고치려고합니다.ListBox ObservableCollection duplicating

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 예제 떨어져 내 코드를 모델링하기 위해 최선을 노력했다 (다음과 같이 나는 다음 컬렉션 내 두 개의 클래스가 내가 달성하기 위해 노력하고, 또는 쉽게 수행 할 수 있습니다 무엇을 달성하기 위해, 나는 때문에이라고 생각되는 DispatcherTimer이, 매 분마다 호출되는 목록 상자 데이터가 중복 될 때

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 

은 무엇 일어나고있는 것은) 알려 주시기 바랍니다 getRoomMeetingDetails 메소드는 모든 틱에 모든 SQL 결과를 추가합니다. 테이블에서 새 데이터 또는 데이터 변경만으로 ListBox를 새로 고치는 방법은 무엇입니까?

내가 잘못 가고있는 부분을 알아 내려고 노력하고 있으며,이를 위해 추가/제거해야 할 부분이 있습니다.

세부 사항이있는 경우 알려주세요. 알려주세요.

매트

답변

1

은 어느 쪽이든 당신 다시 추가하기 전에 목록 상자에서 명확 모든 데이터 또는 컬렉션에 대한 확인을한다. 당신의 eID가 기본 열쇠라고 생각하니? 할 일이 같은 :

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

C# 코드,하지만이 아이디어를 보여준다는

는 는

이 VB를 만들어 developerFusion의 변환은 :

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

쿨이 (작동하도록 뭔가 합리적으로 잘되고있다 C# 변환, 그냥 그것을 작성하는 어떤 좋은). 자, MeetingList 클래스에 추가할까요? – Lima

+0

'getRoomMeetingDetails'하위 – Sascha

+0

위대한 덕분에 훨씬 쉽게됩니다. 악을 행하고 그것이 어떻게 작동하는지보십시오. – Lima