试图通过刷新我的WPF应用程序中的数据集来自动更新我的数据网格

本文关键字:我的 更新 网格 数据网 数据 数据集 刷新 WPF 应用程序 | 更新日期: 2023-09-27 18:06:30

我希望有人能帮助我,因为我是一个真正的新手。我有一个WPF应用程序,绑定到我的web服务器上的SQL数据库。数据库的信息更新是通过自动交易平台完成的。设计此应用程序只是为了实时监视更改。将数据从web服务器绑定到数据网格是没有问题的。然而,我一辈子都不知道如何使数据网格实时更新。我能做的最接近的是添加一个刷新按钮,每次我点击它都能成功更新应用程序。但是,我希望它在数据库发生自动更改时自动更新。有人能告诉我如何修改我的代码,使这个工作吗?我把我的代码放在下面。谢谢!

using System.Windows;
using Microsoft.Windows.Controls.Primitives;
using System.Collections.Generic;
using C1.WPF.DataGrid;
using StylingWPFGrid.ForexDataSetTableAdapters;
using System.Windows.Threading;
using System;
namespace StylingWPFGrid
{ 
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class WPFGrid : Window
{
    private ForexDataSet _infoDataSet = null;
    public ForexDataSet infoDataSet
    {
        get
        {
            if (_infoDataSet == null)
            {
                _infoDataSet = new ForexDataSet();
                infoTableAdapter info = new infoTableAdapter();
                info.Fill(_infoDataSet.info);
            }
            return _infoDataSet;
        }
    }
    private ForexDataSet _tradesDataSet = null;
    public ForexDataSet tradesDataSet
    {
        get
        {
            if (_tradesDataSet == null)
            {
                _tradesDataSet = new ForexDataSet();
                tradesTableAdapter trades = new tradesTableAdapter();
                trades.Fill(_tradesDataSet.trades);
            }
            return _tradesDataSet;
        }
    }
    public WPFGrid()
    {
        InitializeComponent(); this.AccountsDataGrid.ItemsSource = infoDataSet.info;
        InitializeComponent(); this.TradesDataGrid.ItemsSource = tradesDataSet.trades;
    }
    private void QuitBtn_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
    private void RefreshBtn_Click(object sender, RoutedEventArgs e)
    {
        infoTableAdapter info = new infoTableAdapter();
        info.Fill(_infoDataSet.info);
    }
}

}

试图通过刷新我的WPF应用程序中的数据集来自动更新我的数据网格

问题是你没有任何设置你的属性。所以没有更新。这只是问题的一部分。另一个问题是,您将需要实现INotifyPropertyChanged接口。

using System.ComponentModel;
public partial class WPFGrid : Window, INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;
      private void OnPropertyChanged(string propertyName)
      {
         if (PropertyChanged != null)
         {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
         }
      }
}

对于你的属性,你应该这样做:

public ForexDataSet tradesDataSet
{
   get{//add your code here}
   set
   {
      _tradesDataSet = value;
      OnPropertyChanged("tradesDataSet");
   }
}  

如果你希望你的控件更新你的数据库,还要确保你使用双向绑定。

另一个注意事项:您不应该在构造函数中两次要求InitializeComponent(); !它应该是构造函数的第一行,其他两行应该在后面。

在计时器上设置这个的其他建议也是好主意。我也会尝试这样做,除非你有东西设置你的数据集。Backgroundworker就是一个很好的例子。

没有来自数据库的信息,我相信它已经更新了,所以你可以使用计时器每秒钟"点击"按钮。如果DB不能处理这个问题,试着写一个小查询来扫描最近的更新,并且只在更改时获取数据。

此应用程序中的数据未绑定到数据库。它被绑定到您创建的DataSet。

private ForexDataSet _infoDataSet = null;
public ForexDataSet infoDataSet

由于这是一个客户端应用程序,从服务器使用CLR回调函数将不是最好的解决方案。我认为在这种情况下,设置一个"自动刷新"功能就足够了。您可以像前面建议的那样使用计时器。然而,我会在后台线程(Backgroundworker)上这样做,这样你就不会在轮询更改时影响UI。