试图通过刷新我的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);
}
}
}
问题是你没有任何设置你的属性。所以没有更新。这只是问题的一部分。另一个问题是,您将需要实现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。