1

DataGrid (XCeed DataGrid) に項目を表示する WPF アプリケーションがあります。データベース(SQLite)にたくさんのアイテムが含まれているとアプリのロードに時間がかかるので、可能であればyield returnを使ってオンデマンドでロードしたいです。XCeed DataGrid が UI 仮想化をサポートしていることは知っていますが、同期コードの次のブロックを変換する方法が完全にはわかりません。

現在、UI の速度低下を防ぐために BackgroundWorker にロードされているリストは、グリッドの DataSource として取り込まれています。

   public override IList<IRecipe> GetRecipes()
    {
        List<IRecipe> recipes = new List<IRecipe>();
        Execute(conn =>
        {
            using (var cmd = conn.CreateCommand()) {
                cmd.CommandText = "SELECT * FROM recipes  ORDER BY Name";
                var reader = cmd.ExecuteReader();
                while (reader.Read()) {
                    try {
                        var recipe = GetRecipe(reader);
                        recipes.Add(recipe);
                    } catch (Exception ex) {
                        Console.WriteLine(string.Format("Error loading recipe: {0}", ex.Message));
                    }
                }
                reader.Close();

                cmd.CommandText = "SELECT * FROM Ingredients WHERE Recipe = @Recipe";
                cmd.Parameters.AddWithValue("@Recipe", string.Empty);
                foreach (IRecipe recipe in recipes) {
                    cmd.Parameters["@Recipe"].Value = recipe.ID;
                    reader = cmd.ExecuteReader();
                    while (reader.Read()) {
                        try {
                            IIngredient Ingredient = GetIngredient(reader);
                            recipe.Ingredients.Add(Ingredient);
                        } catch (Exception ex) {
                            Console.WriteLine(string.Format("Error adding Ingredient to recipe '{0}': {1}", recipe.Name, ex.Message));
                        }
                    }
                    reader.Close();
                }
            }

または、速度を向上させて遅延読み込みを使用できる他の方法はありますか?

4

2 に答える 2

2

yield returnここではあなたの友達ではありません。イテレータブロック(作成するもの)は、実装するクラスとステートマシンを実装するカスタム列挙子をyield return作成するための単なる構文糖衣です。IEnumerableこれは実際にはパフォーマンス上の利点を提供しません。また、生成するコードは、書き込むコードと同じように同期するため、必ずしも遅延読み込みを容易にするわけではありません。

私はXceedグリッドの専門家ではないため、その製品に固有の回答を提供することはできませんが、遅延読み込みは確かに問題を解決する可能性があります(本当に解決するには、おそらく次のように読み込む必要があります)表示するデータをできるだけ少なくしてから、バックグラウンドスレッドで次のデータの先制読み込みを開始しますが、その方法の詳細は、ここでの回答の範囲を超えています)。

1つのアプローチは、特定の数の行(その時点で表示するために必要なもの)を同期的にロードし、必要に応じて残りの行をロードすることです(データセットが大きく、ユーザーがすべてを見る可能性が低い場合)それら)またはバックグラウンド(セットが大きくないか、ユーザーがそれらすべてを確認する可能性が高い場合)。

于 2011-11-14T19:27:40.273 に答える
0

xceedが仮想化されたアイテムをフェッチする方法を正確に理解していません。
要求される行の範囲を指定するのは、ある種のイベントによるものだと思います。

イベント(または使用されるメソッド)では、クエリの範囲をフェッチします。ドキュメントの下部に記載されているように使用LIMITします。OFFSETSELECT

于 2011-11-14T19:25:43.833 に答える