2013-05-03 64 views
0

故事: 我們有3個不同的表。 TimeReport,Dossier,BU 第一個連接到第二個,一對多。 第二個連接到第三個,一對多。 see picture db.png麻煩過濾電網

我們想使用radgrid組件來顯示'TimeReports'。 我們在過濾器中創建了'DossierId',並顯示'Description'屬性。 這工作正常。

我們現在的問題是我們要顯示和過濾例如BU.BUId和BU.Code是。 我們嘗試了這幾種方法,用java腳本或代碼隱藏起來。 不幸的是它不起作用。 問題似乎是我們想要訪問兩個表上的屬性。 (從 'TimeReport' 過度 '檔案' 到 '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列

隨時在必要時提出問題。

感謝您的幫助和快速的答案。

回答

1

看起來你正在運行到哪裏你的EntityFramework對象從數據庫中,當您篩選和重新綁定斷開的問題,他們不能懶加載您正試圖篩選的內容。嘗試在加載網格,以便你想過濾的表是被過濾斷開集合中提供的初始查詢使用Include()聲明。


代碼示例 - 使用下面的代碼,首先實體框架對象:

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; } 

} 

我能夠重新寫你的FilterExpression的radgrid控件的MasterTableView到:

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

並且該連接有效。

檢查此鏈接,瞭解更多有關如何customize FilterExpressionRadGrid