2017-08-21 18 views
0

私のアプリケーションにDataGridを使用しています。タイマーを使用してデータベースからDataGridを更新しています。タイマーは5秒ごとに更新され、新しいデータがあるかどうかが確認されます。新しいデータがあれば、そのデータグリッドで更新されます。しかし、それはまた、データグリッド内のすべてをリセットし、私は選択したインデックスが緩い。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

はあなたがリフレッシュされる方法の任意の情報を提供することができますあなたのタイマーと 'datagrid'? ViewModel-Bindingを使用していますか?あなたのビュー(=コードビハインド)であなたのデータを更新するように思えます。もっと情報が必要です。ありがとうございました – WoIIe

+0

こんにちはWolle、 私は、私のタイマー機能を使用して質問を更新しました。 – metadata

+0

他の人が同じ問題に直面する可能性があるので、あなたが達成しようとしていることは、良いWPFプログラミングスタイルという観点からは非常に悪い習慣であることを伝えなければなりません。私はこの問題を解決するための[MVVM](https://msdn.microsoft.com/en-us/library/ff798384.aspx)アプローチを選択するようアドバイスします。 – WoIIe

答えて

0

私はすでに、私はあなたのビューのあなたのコードビハインドファイルにあなたのItemsSourceを操作に対する高度なアドバイス(.xaml.csを)だろうというのが私のコメントに書いています。

それでも私はあなたの問題のお手伝いをしてみてください:

あなたが記述問題は、ItemsSourceプロパティにタイマーの各目盛りを設定することが原因で発生します。たぶん、このような何かが、仕事ができる:

// 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

あなたはあなたが前にインデックスを保存しようとすることができItemsSource再設定してから、後で戻ってそれを設定します。

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