2016-06-28 16 views
1

Ich habe DataGrid mit Spalten drin.Aktualisieren DataGrid in Silverlight

Ich möchte die DataGridaktualisiert werden alle 3 Sekunden, mit Daten aus dem Dienst.

Ich brauche, dass die Scroll springt nicht an die Spitze der DataGrid, jedes Mal, wenn es aktualisiert, und bleiben Sie an der gleichen Stelle der Scroll. Ist es möglich?

Hier ist mein Code:

<sdk:DataGrid Grid.Row="1" FlowDirection="RightToLeft" ColumnHeaderHeight="32" 
     AutoGenerateColumns="False" Name="RealTimeReportDataGrid" 
     RowEditEnded="LinesDataGrid_RowEditEnded" RowHeight="40"> 
     <sdk:DataGrid.Columns>...</sdk:DataGrid.Columns> 
</sdk:DataGrid> 

Dies ist der Code hinter:

 public RealTimeReport() 
    { 
     InitializeComponent(); 
     Loaded += OnViewLoaded; 
     RealTimeReportService.RealTimeReportServiceClient RTws = new RealTimeReportService.RealTimeReportServiceClient(); 
     RTws.GetRealTimeReportAsync(); 
     RTws.GetRealTimeReportCompleted += new EventHandler<RealTimeReportService.GetRealTimeReportCompletedEventArgs>(RTws_GetRealTimeReportCompleted); 

    } 

    void RTws_GetRealTimeReportCompleted(object sender, RealTimeReportService.GetRealTimeReportCompletedEventArgs e) 
    { 
     var t = e.Result.ToList(); 
     RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList()); 
    } 


    private void OnViewLoaded(object sender, RoutedEventArgs e) 
    { 
     Start(); 
    } 

    private void OnUpdaterTimerTick(object sender, EventArgs e) 
    { 
     RealTimeReportService.RealTimeReportServiceClient RTws = new RealTimeReportService.RealTimeReportServiceClient(); 
     RTws.GetRealTimeReportAsync(); 
     RTws.GetRealTimeReportCompleted += new EventHandler<RealTimeReportService.GetRealTimeReportCompletedEventArgs>(RTws_GetRealTimeReportCompleted); 
    } 


    public void Start() 
    { 
     InitializeRefreshDataTimer(); 
    } 


    public void InitializeRefreshDataTimer() 
    { 
     _updaterTimer.Interval = new TimeSpan(0, 0, 0, 0, 3000); 
     _updaterTimer.Tick += OnUpdaterTimerTick; 
     _updaterTimer.Start(); 
    } 

Dank voraus.

Update: @StepUp, ist dies die einzige Änderung, die ich gemacht, nach dem, was Sie gesagt haben, aber noch keine Änderung :(

void RTws_GetRealTimeReportCompleted(object sender, RealTimeReportService.GetRealTimeReportCompletedEventArgs e) 
{ 
    var t = e.Result.ToList(); 

    RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList()); 

    this.RealTimeReportDataGrid.Dispatcher.BeginInvoke(() => 
    { 
     RealTimeReportDataGrid.ScrollIntoView(
     RealTimeReportDataGrid.SelectedItem, 
     RealTimeReportDataGrid.CurrentColumn); 
    }); 
    //RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList()); 
    //RealTimeReportDataGrid.UpdateLayout(); 
    //RealTimeReportDataGrid.ScrollIntoView(RealTimeReportDataGrid.SelectedItem, RealTimeReportDataGrid.Columns[0]); 
} 

Antwort

2

alle 3 Sekunden aktualisieren nur use Timer class:

System.Timers.Timer aTimer = new System.Timers.Timer(); 
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
aTimer.Interval=3000; 
aTimer.Enabled=true; 


// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //add new data 
} 

Das Ereignis Elapsed wird alle X Sekunden in Millisekunden von der Eigenschaft Interval auf dem Timer-Objekt ausgelöst. Es ruft die 0 aufMethode, die Sie angeben, im obigen Beispiel ist es OnTimedEvent.

Um Scroll auf der gleichen Position in DataGrid zu bleiben:

yourDataGrid.ItemsSource = data; 
yourDataGrid.UpdateLayout(); 
yourDataGrid.ScrollIntoView(theDataGrid.SelectedItem, theDataGrid.Columns[0]); 

Update:

yourDataGrid.Dispatcher.BeginInvoke(() => 
{ 
    yourDataGrid.Focus();  
    yourDataGrid.SelectedItem=whateverYouWant; 
    yourDataGrid.CurrentColumn=yourDataGrid.Columns[0]; 
    yourDataGrid.ScrollIntoView(yourDataGrid.SelectedItem, yourDataGrid.CurrentColumn); 
}); 

OR:

yourDataGrid.SelectedIndex = 5; // the index you want to select 
yourDataGrid.UpdateLayout(); 
yourDataGrid.ScrollIntoView(Grid.SelectedItem, 0); 
+0

ich meinem ursprünglichen Beitrag bearbeitet, gerade in der gleichen Zeit du hast geantwortet. Jetzt ist die Aktualisierung in Ordnung, aber das Scrollen springt immer noch nach oben, nachdem ich runterscrollen bin. – David

+0

@David hast du den unteren Teil meiner Antwort gesehen? Haben Sie versucht, 'yourDataGrid.ScrollIntoView (theDataGrid.SelectedItem, theDataGrid.Columns [0]);'? – StepUp

+0

Ja, ich habe versucht, es am Ende von 'RTws_GetRealTimeReportCompleted' zu platzieren. Aber nichts hat sich geändert. – David