2017-08-21 4 views
0

J'utilise DataGrid pour mon application et j'utilise la minuterie pour mettre à jour la grille de données de la base de données. La minuterie se rafraîchit toutes les 5 secondes pour voir s'il y a de nouvelles données. S'il y a de nouvelles données, elles sont mises à jour dans le DataGrid. Mais il réinitialise aussi tout dans le DataGrid et je perds l'index sélectionné. Comment puis-je empêcher la mise à jour ou la modification de l'élément sélectionné alors que d'autres lignes sont mises à jour?Empêcher l'actualisation de la ligne sélectionnée dans DataGrid

DataGrid

public void InitTimer() 
{ 
    Timer timer1 = new Timer(); 
    timer1.Elapsed += Timer1_Elapsed; 
    timer1.Interval = 5000; // in milliseconds 
    timer1.Start(); 
} 

private void Timer1_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Application.Current.Dispatcher.Invoke((Action)(() => 
    { 
     dataGrid1.ItemsSource = AddData(dataGrid1); 
    })); 
} 
+1

Pouvez-vous fournir des informations que vous actualisez le 'dataagrid' avec votre minuteur? Utilisez-vous une ViewModel-Binding? Il semble que vous mettez à jour vos données dans votre vue (= code-behind). Nous avons besoin de plus d'informations. Merci – WoIIe

+0

Salut Wolle, J'ai mis à jour la question avec ma fonction de minuteur que j'utilise pour mettre à jour la grille de données. – metadata

+0

Puisque d'autres personnes peuvent faire face au même problème, je dois vous informer que ce que vous essayez d'accomplir est une très mauvaise pratique en termes de style de programmation WPF. Je vous conseille de choisir une approche [MVVM] (https://msdn.microsoft.com/fr-fr/library/ff798384.aspx) pour résoudre ce problème. – WoIIe

Répondre

0

je l'ai déjà écrit dans mon commentaire que je serais obligé de bien des conseils contre la manipulation de vos ItemsSource dans votre fichier code-behind (.xaml.cs) de votre point de vue.

Néanmoins, j'essayer de vous aider avec votre problème:

Le problème que vous décrivez se produit en raison de définir la propriété ItemsSource chaque tic-tac de l'horloge. Peut-être quelque chose comme cela pourrait fonctionner:

// This is the collection to bind your datagrid to 
public ObservableCollection<YourObject> Data { get; } = new ObservableCollection<YourObject>(); 

// This method needs to be called once (preferably in the constructor) 
private void InitDataGrid() 
{ 
    dataGrid1.ItemsSource = this.Data; 
} 

private void Timer1_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Application.Current.Dispatcher.Invoke((Action)(() => 
    { 
     // Here you need to call a method which modifies the Data property. 
     // Try removing, inserting, updating the items directly to the collection. 
     // Do not set the ItemsSource directly, instead manipulate the ObservableCollection. 
    })); 
} 
0

Vous pouvez essayer de sauver l'index avant de re-régler la ItemsSource puis définissez revenir plus tard:

private void Timer1_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Application.Current.Dispatcher.Invoke((Action)(() => 
    { 
     int index = dataGrid1.SelectedIndex; 
     dataGrid1.ItemsSource = AddData(dataGrid1); 
     dataGrid1.SelectedIndex = index; 
    })); 
}