開発中のRIAサービスアプリケーションがあり、サーバー側のページングとDataGridでのページングされたアイテムの表示に問題があります。PageIndexとPageSizeがいくつかのフィルターパラメーターとともにクエリを介して渡されるカスタムDomainServiceを使用しています。
問題は、結果の最初のページが正しく表示されることですが、次の結果セットにページングすると、サーバーから返された新しい結果を表示するだけでなく、アイテムがリストの最後に追加されます。つまり、私のDataGridは、返された結果の最新ページを表示するだけでなく、サーバーから返されたすべての累積オブジェクトを表示しています。
まず、DomainCollectionViewとDomainCollectionViewLoaderを使用しています。
_context = new StudyQueryContext();
_entityList = new EntityList(_context.PortalStudies);
_loader = new DomainCollectionViewLoader(Load, LoadComplete);
PortalStudies = new DomainCollectionView(_loader, _context.PortalStudies);
次に、かなり標準的なLoad()メソッドとLoadComplete()メソッドがあります。
public LoadOperation Load()
{
if (IsLoading)
{
return null;
}
IsLoading = true;
EntityQuery q = _context.GetPortalStudyQuery(PatientsName, PatientId, AccessionNumber, PortalStudies.PageIndex, PortalStudies.PageSize);
return _context.Load(q);
}
private void LoadComplete(LoadOperation op)
{
if (op.HasError)
{
System.Windows.MessageBox.Show(op.Error.ToString(), "Search Error", System.Windows.MessageBoxButton.OK);
op.MarkErrorAsHandled();
}
else if (!op.IsCanceled)
{
_entityList.Source = op.Entities;
_context.PortalCountAll(PatientsName, PatientId, AccessionNumber, CountAllComplete, null);
}
IsLoading = false;
}
PortalCountAllメソッドが戻るときにTotalItemCountを割り当てることに注意してください。
完全を期すために、DomainServiceQueryメソッドのシグネチャは次のとおりです。
[Query]
public IEnumerable<PortalStudy> GetPortalStudy(string patientsName, string patientId, string accessionNumber, int startIndex, int pageSize)
{ }
問題は、_entityListの設定方法と、LoadComplete()メソッドでの結果の割り当てにあると思います。
_entityList.Source = op.Entities;
すべてのLINQベースの例では、この割り当てにより、現在の結果のみをDataGridに表示できるようになっているようです。何らかの理由で、カスタムクエリメソッドを使用する場合、これは当てはまらないようです。
ページを変更したときにDataGridをクリアするための好ましい方法は何ですか?クエリを実行する前に_context.PortalStudies.Clear()を呼び出して結果をクリアできることはわかっていますが、これによりページがフラッシュされ、アイテムがクリアされ、クエリがサーバーから返されるまで再度入力されません。カスタムDomainServiceを使用するときに、結果の現在のページだけを表示する適切な方法は何ですか?