1

我有一个 WPF 应用程序,它显示 DataGrid (XCeed DataGrid) 中的项目。当数据库 (SQLite) 包含大量项目时,该应用程序需要一段时间才能加载,因此如果可能的话,我想使用 yield return 来按需加载这些项目。我知道XCeed DataGrid 支持 UI 虚拟化,但我不完全确定如何转换以下同步代码块。

目前,在 BackgroundWorker 中加载列表以防止 UI 变慢,填充为网格的 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 网格方面的专家,因此我无法为您提供该产品特有的答案,但延迟加载确实可能有助于解决您的问题(要真正解决它,您可能必须加载为尽可能少的数据显示,然后开始在后台线程中抢先加载即将到来的数据,但如何做到这一点的细节超出了这里的答案范围)。

一种方法可能是同步加载特定数量的行(当时需要显示的任何内容),然后根据需要加载其余行(如果您的数据集很大并且用户不太可能查看所有它们)或在后台(如果集合不大或用户可能会全部查看)。

于 2011-11-14T19:27:40.273 回答
0

我不完全熟悉 xceed 如何获取虚拟化项目。
我假设它是通过某种事件指定请求的行范围。

如果事件(或使用的任何方法)您获取查询范围。按照文档底部的说明使用LIMIT和。OFFSETSELECT

于 2011-11-14T19:25:43.833 回答