ListBox ObservableCollection 复制

发布于 2024-11-30 00:09:47 字数 2196 浏览 2 评论 0原文

我有一个 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 结果 打钩。如何仅使用表中的新数据或数据更改来刷新列表框?

我真的很难找出哪里出了问题,以及需要添加/删除什么才能使其发挥作用。

如果我缺少任何细节,请告诉我。

马特

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寂寞美少年 2024-12-07 00:09:47

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

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文