2011-08-24 4 views
0

나는 진정한 초보자로서 나를 도울 수 있기를 바랍니다. 내 웹 서버의 SQL 데이터베이스에 바인딩 된 WPF 응용 프로그램이 있습니다. 데이터베이스를 업데이트하는 정보는 자동화 된 거래 플랫폼에서 이루어집니다. 이 응용 프로그램은 변경 사항을 실시간으로 모니터링하기 위해 설계되었습니다. 웹 서버의 데이터를 DataGrid에 바인딩하는 데는 아무런 문제가 없었습니다. 그러나 나는 실시간으로 DataGrid를 업데이트하는 방법을 알지 못합니다. 가장 가까운 방법은 클릭 할 때마다 응용 프로그램을 성공적으로 업데이트하는 새로 고침 단추를 추가하는 것입니다. 그러나 데이터베이스가 자동으로 변경 될 때마다 자체적으로 자동 업데이트하는 것이 좋습니다. 누군가이 코드를 수정하여이 작업을 수행하는 방법을 보여 주실 수 있습니까? 아래 코드를 배치했습니다. 감사!내 WPF 응용 프로그램에서 데이터 집합 새로 고침을 통해 내 데이터 그리드를 자동 업데이트하려고 시도합니다.

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

    } 

} 

}

답변

2

문제는 당신이 당신의 속성을 설정 아무것도하지 않아도됩니다. 그래서 아무것도 업데이트되지 않습니다. 그것은 문제의 일부일뿐입니다. 다른 문제는 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이 좋은 예입니다.

+0

의견을 보내 주셔서 감사합니다. 구성 요소 초기화 및 TwoWay에 대한 바인딩 설정을 완료했습니다. 내 코드 내에서 INotifyPropertyChange를 정확히 배치해야하는 문제가 있지만 계속 유지할 것입니다. 다시 한번 감사드립니다. – Stan

+0

인터페이스를 배치해야하는 위치를 보여주기 위해 코드가 업데이트되었습니다. – Billy

+0

빌리, 나는 당신이 보여준대로 모든 것을 삽입하려고 시도했는데 내가 그 일을 할 때 한 줄의 빨간색 밑줄 오류가 있었고 라인의 마지막 "e"아래에 있었다 : PropertyChanged (this, new PropertyChangedEventArgs (e)); 그러나 응용 프로그램을 실행할 때 오류나 경고가 없었으며 응용 프로그램이 시작되어 새로 고침되지 않았습니다. – Stan

0

업데이트 된 데이터베이스의 정보가 없으므로 타이머를 사용하여 매 초마다 "클릭"할 수 있습니다. DB가이를 처리 할 수없는 경우 마지막 업데이트를 검색하고 변경된 경우에만 데이터를 가져 오는 작은 쿼리를 작성하십시오.

0

이 응용 프로그램의 데이터는 데이터베이스에 바인딩되지 않습니다. 사용자가 만든 DataSet에 바인딩됩니다. 이 이후

private ForexDataSet _infoDataSet = null; 
public ForexDataSet infoDataSet 

최고의 솔루션이 아닐 것입니다 서버에서 기능을 CLR은 호출을 다시 사용하여 클라이언트 응용 프로그램입니다. 이 경우에는 "자동 새로 고침"기능을 설정하는 것으로 충분하다고 생각합니다. 이전에 제안한대로 타이머를 사용할 수 있습니다. 그러나 변경 사항을 폴링하는 동안 UI에 영향을주지 않도록 배경 스레드 (Backgroundworker)에서이 작업을 수행합니다.

관련 문제