Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试通过刷新WPF应用程序中的数据集来自动更新我的Datagrid_C#_Wpf - Fatal编程技术网

C# 尝试通过刷新WPF应用程序中的数据集来自动更新我的Datagrid

C# 尝试通过刷新WPF应用程序中的数据集来自动更新我的Datagrid,c#,wpf,C#,Wpf,我希望有人能帮助我,因为我是一个真正的新手。我有一个WPF应用程序,它绑定到我的Web服务器上的SQL数据库。数据库的信息更新是通过自动交易平台完成的。此应用程序旨在实时监控更改。将数据从Web服务器绑定到datagrid没有问题。然而,我一辈子都不知道如何实时更新datagrid。我所能做的最接近的事情就是添加一个刷新按钮,每次单击它都会成功地更新应用程序。但是,我希望它能够在数据库自动更改时自动更新。有人能告诉我如何修改我的代码使之工作吗?我已经把代码放在下面了。谢谢 using Syste

我希望有人能帮助我,因为我是一个真正的新手。我有一个WPF应用程序,它绑定到我的Web服务器上的SQL数据库。数据库的信息更新是通过自动交易平台完成的。此应用程序旨在实时监控更改。将数据从Web服务器绑定到datagrid没有问题。然而,我一辈子都不知道如何实时更新datagrid。我所能做的最接近的事情就是添加一个刷新按钮,每次单击它都会成功地更新应用程序。但是,我希望它能够在数据库自动更改时自动更新。有人能告诉我如何修改我的代码使之工作吗?我已经把代码放在下面了。谢谢

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;}()