【问题标题】:ListBox ObservableCollection duplicatingListBox ObservableCollection 重复
【发布时间】: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


    【解决方案1】:

    在再次添加之前清除列表框中的所有数据,或者检查集合。我假设您的 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
    

    【讨论】:

    • 很酷,这是可以使用的东西(已经相当擅长转换 C#,只是不擅长编写它)。现在,我要把它添加到 MeetingList 类中吗?
    • 在“getRoomMeetingDetails”子中
    • 太好了,感谢这让事情变得更容易。我会试一试,看看它是如何工作的。
    • 酷,它只使用了我添加的数据,而应用程序运行在显示的应用程序中可见。是否可以重新排序数据?首次绑定时的数据按日期顺序排序,但新数据将添加到列表末尾。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2012-08-03
    • 1970-01-01
    • 2018-09-11
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多