2016-10-25 6 views
0

私のプロジェクトには、通常の基本的なKendo UIグリッドバインドを実行できないという2つの主な問題があります。 1.私は、必要なSQLデータへの完全なアクセス権を持っていません(私はビューを作成できません)。2.フィールドの1つは非常に大きいです(フィールドはViewModelをオーバーロードします)。剣道UIグリッドを2つのテーブルEFで正しくバインドして塗りつぶすにはどうすればよいですか?

私はグリッドを動作させることができましたが、私はそのタスクを達成するためのよりよい方法があると感じています。私の問題は、本質的には、私はDBの単一のテーブルにグリッドバインドすることしかできないということです。これを受け入れるために、私は外部キーフィールドにバインドし、readからデータを書き込むためにclientTemplateを使用しましたが、フィールドをデータにバインドするより直接的な方法が必要であると感じました。私の読んだデータは、JSONに変換されたEFからのLinqジョインのactionresultです。 誰かが提案をすることができれば、ここに私のコードです。テーブル2のD_Typeは、列に直接バインドしようとしているものです。

@(Html.Kendo().Grid<ProjectName.Models.Table1>() 
    .Name("grid") 
    .Scrollable() 
    .ColumnMenu() 
    .Reorderable(reorder => reorder.Columns(true)) 
    .Columns(columns => 
    { 

     columns.Bound(c => c.P_Name); 
     columns.Bound(c => c.E_Name); 
     //Cannot be directly bound to a column because it is part of Table2 table 
     columns.Bound(c => c.TypeId).Title("Type").ClientTemplate("#= D_Type #").Filterable(false);    
     columns.Command(command => command.Custom("Details").Click("showDetails")).Title("Results").Width(80); 
     columns.Bound(c => c.Destination); 
     columns.Bound(c => c.Location); 
     columns.Bound(c => c.Version); 
     columns.Bound(c => c.StartDt); 
     columns.Bound(c => c.EndDt); 
     columns.Bound(c => c.StartDt).Title("Duration").ClientTemplate("#: calcDuration(StartDt, EndDt) #").Sortable(false).Filterable(false); 
     columns.Bound(c => c.); 
     columns.Bound(c => c.MiscNotes).ClientTemplate("#: errorDisplay(ResultObject) # ").Sortable(false).Filterable(false); 


    }) 
    //Style dictates full grid height 
    .HtmlAttributes(new { style = "height: 725px;" }) 
    .Filterable() 
    .Resizable(resize => resize.Columns(true)) 
    .Sortable(sortable => sortable 
     .AllowUnsort(true) 
     .SortMode(GridSortMode.SingleColumn)) 
    .Pageable(pageable => pageable 
     .Refresh(false) 
     .PageSizes(true) 
     .ButtonCount(5)) 
    .Events(e => e.DataBound("onDataBound")) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Sort(sort => sort.Add("StartDt").Descending()) 
     .Read(read => read.Action("Project_Read", "Grid")) 
     .PageSize(20) 
     .ServerOperation(true) 
    ) 
    ) 

答えて

0

グリッドをProjectName.Models.Table1にバインドしないでください。代わりに

、そして、あなたはProject_Read方法は、これらのリストを返す必要があり、すなわち

public class SpecificGridViewModel 
{ 
    public string P_Name { get; set; } 
    // Other fields you want from Table1 
    // ... 
    // PLUS the field(s) you want from the other, joined table. 
    public string D_Type { get; set; } 
} 

、あなたがグリッドに表示することを表2から表1およびフィールドからフィールドが含まれているのViewModelにバインドTable1sのリストの代わりにLINQクエリから構築したViewModels。

つまり、必要な正確なデータ(Table1のデータはTable1.TypeIDを介してTable2.D_Typeに結合されています)を返すLINQクエリを作成し、クエリからデータを保持するために作成したカスタムViewModelの結果セットを返します「生の」Table1モデルの代わりにそのモデルにグリッドをバインドします。

+0

これは99%の時間で動作しますが、残念ながらフィールドの1つのサイズのためにこのようにSystem.OutofMemoryエラーが発生しています。 – fdsafdsafdsafdsafs

+0

それから、それをやり直してください。(オンデマンドでD_Typeを取得して表示しています)...フィールドのサイズが大きすぎる場合、グリッドが役立つことはあまりありません。私はまた、そのようなデータを表示する必要性について疑問を呈します(特にあなたのものではなく、顧客は1200ページのレポートを読む必要はなく、実際にはXLSXダンプが必要です)...コンピュータが処理できない快適に、人間は実際にスクリーン上のデータで意味のある何かを処理/実行しようとしていますか? –

+0

あなたの解決策を読んで私の誤りがどこにあるかを私に見せてくれました。私はViewModelを別のモデルではなくActionResult Readに配置しました。これが、VMに大量のデータを送信していた理由です。時には一歩踏み出して物事をもう一度読む必要があることもあります。ありがとうございました。 – fdsafdsafdsafdsafs