2011-11-14 3 views
1

DataGrid (XCeed DataGrid)에 항목을 표시하는 WPF 응용 프로그램이 있습니다. 이 응용 프로그램은 데이터베이스 (SQLite)에 많은 항목이 포함되어있는 경우로드하는 데 시간이 걸리므로 필요에 따라로드 할 수 있도록 yield return을 사용하고 싶습니다. 나는 XCeed DataGrid supports UI virtualization을 알고 있지만, 동기 코드의 다음 블록을 어떻게 변환 할지는 모르겠습니다.데이터 레이어에서 수익률 반환

현재 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(); 
       } 
      } 

또는 내가 속도를 개선하고 게으른 로딩을 사용할 수있는 다른 방법은 무엇입니까?

+0

직접 모든 것을로드해야합니까? – jgauffin

답변

0

정확하게 xceed가 가상화 된 항목을 가져 오는 방법에 익숙하지 않습니다.
어떤 종류의 이벤트가 요청한 행의 범위를 지정한다고 가정합니다.

이벤트 (또는 사용 된 모든 방법)에서 쿼리 범위를 가져옵니다. SELECT documentation 하단에 표시된대로 LIMITOFFSET을 사용하십시오.

+0

그것은 옳은 것처럼 보입니다. 문제는 마지막 무료 버전 (3.1)이 지원하지 않는다는 것입니다. WPF Toolkit DataGrid 로의 전환이 필요합니다. – Echilon

+0

@Echilon : 사용중인 .NET 버전은 무엇입니까? .NET 4.0에는 표준'PresentationFramework' 어셈블리의 일부로'DataGrid'가 포함되어 있습니다. WPF 툴킷은 .NET 3.x에서만 필요했습니다. –

+0

잠시 동안 DataGrid를 사용하지 않았습니다. 이전 버전의 응용 프로그램 용이었습니다. – Echilon

2

yield return 여기에 친구가 아닙니다. 반복자 블록 (yield return이 생성하는 것)은 IEnumerable을 구현하는 클래스를 작성하기위한 구문 론적 설탕이며 상태 시스템을 구현하는 사용자 정의 열거 자입니다. 실제로 생성되는 코드는 사용자가 작성하는 코드와 동일한 동기식이기 때문에 실제로는 성능상의 이점을 제공하지 않으며 지연로드를 반드시 촉진하지도 않습니다.

저는 Xceed 그리드에 대한 전문 지식이 없으므로 해당 제품에만 해당하는 답변을 드릴 수는 없지만 실제로 게으른로드가 문제를 해결하는 데 도움이 될 수 있습니다. 가능한 적은 데이터를로드하여 표시해야하고 백그라운드 스레드에서 곧 데이터를 선점 적으로로드해야하지만, 수행 방법에 대한 자세한 내용은 여기에서 답변 범위를 벗어납니다.

특정 수의 행을 동시 적으로로드 (한 번에 표시해야하는 모든 항목) 한 다음, 필요에 따라 나머지 행을로드 할 수도 있습니다 (데이터 세트가 크고 사용자가 모두보기) 또는 백그라운드에서 (세트가 크지 않거나 사용자가 모두 검토 할 가능성이있는 경우).

+0

감사합니다. WPF DataGrid는 [AsyncVirtualizingCollection]을 사용하여 유망한 대체 솔루션을 제공하는 것으로 보입니다. [here] (http://bea.stollnitz.com/blog/?p=411) – Echilon

관련 문제