C# 尝试通过刷新WPF应用程序中的数据集来自动更新我的Datagrid
我希望有人能帮助我,因为我是一个真正的新手。我有一个WPF应用程序,它绑定到我的Web服务器上的SQL数据库。数据库的信息更新是通过自动交易平台完成的。此应用程序旨在实时监控更改。将数据从Web服务器绑定到datagrid没有问题。然而,我一辈子都不知道如何实时更新datagrid。我所能做的最接近的事情就是添加一个刷新按钮,每次单击它都会成功地更新应用程序。但是,我希望它能够在数据库自动更改时自动更新。有人能告诉我如何修改我的代码使之工作吗?我已经把代码放在下面了。谢谢C# 尝试通过刷新WPF应用程序中的数据集来自动更新我的Datagrid,c#,wpf,C#,Wpf,我希望有人能帮助我,因为我是一个真正的新手。我有一个WPF应用程序,它绑定到我的Web服务器上的SQL数据库。数据库的信息更新是通过自动交易平台完成的。此应用程序旨在实时监控更改。将数据从Web服务器绑定到datagrid没有问题。然而,我一辈子都不知道如何实时更新datagrid。我所能做的最接近的事情就是添加一个刷新按钮,每次单击它都会成功地更新应用程序。但是,我希望它能够在数据库自动更改时自动更新。有人能告诉我如何修改我的代码使之工作吗?我已经把代码放在下面了。谢谢 using Syste
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);
}
}
使用System.Windows;
使用Microsoft.Windows.Controls.Primitives;
使用System.Collections.Generic;
使用C1.WPF.DataGrid;
使用StyleingWPFGRID.ForexDataSetTableAdapters;
使用System.Windows.Threading;
使用制度;
命名空间样式wpfgrid
{
///
///Window1.xaml的交互逻辑
///
公共部分类WPFGrid:Window
{
私有ForexDataSet _infoDataSet=null;
公共ForexDataSet infoDataSet
{
得到
{
如果(_infoDataSet==null)
{
_infoDataSet=新的ForexDataSet();
infoTableAdapter info=新建infoTableAdapter();
info.Fill(_infoDataSet.info);
}
返回infoDataSet;
}
}
私有ForexDataSet _tradesDataSet=null;
公共外汇数据集交易数据集
{
得到
{
如果(_tradesDataSet==null)
{
_tradesDataSet=newforexdataset();
TradeStableApter trades=新的TradeStableApter();
交易。填写(交易数据集交易);
}
返回交易数据集;
}
}
公共WPFGrid()
{
InitializeComponent();this.AccountsDataGrid.ItemsSource=infoDataSet.info;
InitializeComponent();this.TradesDataGrid.ItemsSource=tradesDataSet.trades;
}
私有void QuitBtn_单击(对象发送方,路由目标)
{
这个。关闭();
}
私有无效刷新单击(对象发送方,路由目标)
{
infoTableAdapter info=新建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()代码>在构造函数中执行两次!它应该是构造函数中的第一行,其他两行应该在后面
其他关于设置计时器的建议也是好主意。我也会尝试这样做,除非您对数据集进行了设置。这是一个很好的例子。我相信数据库中没有更新过的信息,所以您可以使用计时器每秒“单击”按钮。如果数据库无法处理此问题,请尝试编写一个小查询,扫描上次更新,并仅在数据发生更改时获取数据。此应用程序中的数据未绑定到数据库。它绑定到您创建的数据集
private ForexDataSet _infoDataSet = null;
public ForexDataSet infoDataSet
因为这是一个客户端应用程序,使用来自服务器的CLR回调函数并不是最好的解决方案。我认为在这种情况下,设置“自动刷新”功能就足够了。您可以按照前面的建议使用计时器。不过,我会在后台线程(Backgroundworker)上执行此操作,这样在轮询更改时不会影响UI 感谢您的反馈,我已经修复了初始化组件并设置了双向绑定。在代码中放置INotifyPropertyChange的确切位置上存在问题,但我会坚持下去。再次感谢。我更新了代码以显示界面的位置。Billy,我尝试按您所示插入所有内容,但在插入时只有一个红色下划线错误,该错误位于行中最后一个“e”下:PropertyChanged(这是新的PropertyChangedEventArgs(e));但是,当我运行应用程序时,我没有出现任何错误或警告,应用程序出现并且没有刷新。。。这是我的复制粘贴错误!“e”应该改为“propertyName”,我更新了帖子。使用上面的代码,您仍然需要调用属性上的集合。Stephan B和tsells的建议可以用来帮助解决这个问题。我已经发布了修改后的代码,希望您可以在这里查看。另外,我注意到在运行应用程序时,代码底部自动插入了一行:公共字符串e{get;set;}()