1

開発中の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を使用するときに、結果の現在のページだけを表示する適切な方法は何ですか?

4

1 に答える 1

1

LINQをサポートしないカスタムORMを使用する場合は、PageIndexとPageSizeを渡すことができます(渡す必要があります)。ORMに対してページングできるようになりますが、ページングが少し複雑になります。DomainService.Countをオーバーライドする、totalCountoutパラメーターを追加する必要があります。

ただし、あなたの場合、バグはEntityList(_entityList)ではなくEntitySet(_context.PortalStudies)をDCVコンストラクターに渡したことが原因のようです。

于 2011-07-18T16:31:40.463 に答える