0

ストーリー: 3 つの異なるテーブルがあります。TimeReport、Dossier、BU 最初のものは 2 番目のものに 1 対多で接続されています。2 番目のものは、1 対多で 3 番目のものに接続されます。 画像参照 db.png

「TimeReports」を表示するために radgrid コンポーネントを使用したいと考えました。たとえば、「DossierId」のフィルターを組み込み、プロパティ「説明」を表示しています。これはうまくいきます。

問題は、たとえば BU.BUId と BU.Code を表示してフィルター処理することです。Java スクリプトまたはコード ビハインドを使用して、いくつかの方法でこれを試しました。残念ながら、うまくいきません。問題は、2 つのテーブルのプロパティにアクセスしたいことです。(「TimeReport」から「Dossier」を介して「BU」へ)

    <telerik:GridBoundColumn DataField="Dossier.BU.Code" FilterControlAltText="Filter BUId column" 
    HeaderText="BU" SortExpression="BUId" UniqueName="BUId"> 
    <FilterTemplate> 
        <telerik:RadComboBox ID="RadComboBoxTitle" DataSourceID="dsBU" DataTextField="Code" 
            DataValueField="BUId" AppendDataBoundItems="true" AutoPostBack="true" 
            OnPreRender="RadComboBoxTitle_PreRender" 
            runat="server" OnSelectedIndexChanged="RadComboBoxTitle_SelectedIndexChanged"> 
            <Items> 
                <telerik:RadComboBoxItem Text="All" /> 
            </Items> 
        </telerik:RadComboBox> 
    </FilterTemplate> 
</telerik:GridBoundColumn> 

コードビハインド

protected void RadComboBoxTitle_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e) 
{ 
    RadComboBox buCombo = sender as RadComboBox; 

    ViewState["buComboValue"] = buCombo.SelectedValue; 

    TimeReportGrid.MasterTableView.FilterExpression = "(it.[Dossier.BUId] = " + buCombo.SelectedValue + ")"; 
    GridColumn column = TimeReportGrid.MasterTableView.GetColumnSafe("BUId"); 
    column.CurrentFilterFunction = GridKnownFunction.EqualTo; 
    column.CurrentFilterValue = buCombo.SelectedValue; 
    TimeReportGrid.Rebind(); 
} 
protected void RadComboBoxTitle_PreRender(object sender, EventArgs e) 
{ 
    if (ViewState["buComboValue"] != null) 
    { 
        RadComboBox buCombo = sender as RadComboBox; 
        buCombo.SelectedValue = ViewState["buComboValue"].ToString(); 
    } 
} 

このコードは、「TimeReportGrid.Rebind()」でエラーをスローします。

「Dossier.BUId」は、現在読み込まれているスキーマのタイプ「Model.TimeReport」のメンバーではありません。エスケープされた識別子の近く、6 行目、5 列目。

必要があれば遠慮なく質問してください。

あなたの助けと素早い答えをありがとう。

4

1 に答える 1

1

フィルタリングと再バインドを行っているときに EntityFramework オブジェクトがデータベースから切断され、フィルタリングしようとしているコンテンツを遅延ロードできないという問題が発生しているようです。グリッドをロードする最初のクエリでInclude()ステートメントを使用してみてください。これにより、フィルタリング対象のテーブルが、フィルタリングされている切断されたコレクションで利用できるようになります。


コード サンプル - 次の Code-First Entity Framework オブジェクトを使用:

public class MyContext : DbContext
{

    public DbSet<TimeReport> TimeReport { get; set; }

    public DbSet<Dossier> Dossier { get; set; }

    public DbSet<BU> BU { get; set; }

}

public class BU
{

    public int BUId { get; set; }

    public string Code { get; set; }

}

public class Dossier
{

    public int DossierId { get; set; }

    [ForeignKey("BU")]
    public int BUId { get; set; }

    public BU BU { get; set; }

}

public class TimeReport
{

    public int TimeReportId { get; set; }

    [ForeignKey("Dossier")]
    public int DossierId { get; set; }

    public Dossier Dossier { get; set; }

}

RadGrid の MasterTableView で FilterExpression を次のように書き換えることができます。

TimeReportGrid.MasterTableView.FilterExpression = "(it.Dossier.BUId = " + buCombo.SelectedValue + ")";

そしてその接続は機能します。

RadGridのFilterExpressionをカスタマイズする方法の詳細については、このリンクを確認してください。

于 2013-05-03T15:06:22.660 に答える