2012-12-21 22 views
5

Mam datagrid, który wyświetla tabela, która jest powiązany z SQL Server DB. Chciałbym ustawić zegar na każde 60 sekund, który sprawdza każdą aktualizację, a następnie wyświetla najnowsze zaktualizowane dane.WPF Datagrid - automatyczne odświeżanie

tej pory stworzyliśmy event_handler dla DataGrid, który zawiera timer obiekt dyspozytora

private void dataGrid1_loaded(object sender, RoutedEventArgs e) 
{ 
    DispatcherTimer dispatcherTimer = new DispatcherTimer(); 
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
    dispatcherTimer.Interval = new TimeSpan(0, 0, 60); 
    dispatcherTimer.Start(); 
} 

Teraz nie wiem jak dalej postępować z obsługi zdarzeń do obsługi nowo aktualizowane dane z bazy danych .

dispatcherTimer_Tick 

Oto moja instrukcja wyboru, która służy do wypełnienia datagridu.

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     String selectstatement = "select top 2 ItemID, ItemName,ConsumerName, Street, DOJ from ConsumarTB order by ItemID "; 
     da = new SqlDataAdapter(selectstatement, con); 
     ds = new DataSet(); 
     da.Fill(ds); 
     dataGrid1.ItemsSource = ds.Tables[0].DefaultView; 

    } 
    catch (SqlException e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 

Odpowiedz

6

Istnieje wiele sposobów na poprawę tego, co powyżej. Ale oto, co chciałbym spróbować na początek.

Poniżej wypełnisz datagrid po wczytaniu strony, ustaw zegar, aby zaznaczyć co 60 sekund. Gdy zegar odlicza, wywoła metodę ponownego ładowania danych do sieci.

//On PageLoad, populate the grid, and set a timer to repeat ever 60 seconds 
private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     RebindData(); 
     SetTimer(); 
    } 
    catch (SqlException e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 

//Refreshes grid data on timer tick 
protected void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    RebindData(); 
} 

//Get data and bind to the grid 
private void RebindData() 
{ 
    String selectstatement = "select top 2 ItemID, ItemName,ConsumerName, Street, DOJ from ConsumarTB order by ItemID "; 
    da = new SqlDataAdapter(selectstatement, con); 
    ds = new DataSet(); 
    da.Fill(ds); 
    dataGrid1.ItemsSource = ds.Tables[0].DefaultView; 
} 

//Set and start the timer 
private void SetTimer() 
{ 
    DispatcherTimer dispatcherTimer = new DispatcherTimer(); 
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
    dispatcherTimer.Interval = new TimeSpan(0, 0, 60); 
    dispatcherTimer.Start(); 
} 
+0

ładna ilustracja dla początkujących. Dziękuję Ci. pozwól mi spróbować i wrócić do ciebie. – user1221765

+1

będzie dobrym pomysłem do osiągnięcia tego poprzez wdrożenie INotifyPropertyChanged? – user1221765

+1

Byłaby to świetna okazja, aby zajrzeć do 'ObservableCollection ', a także 'INotifyPropertyChanged'. Jeśli utworzysz klasę niestandardową i powiążesz swoją siatkę z 'ObservableCollection ', nie powinieneś ponownie powiązywać swoich aktualizacji. Sugeruję, że robisz to tylko dla korzyści edukacyjnych wpf. :) – Khan