故事: 我们有3个不同的表。时间报告,档案,BU 第一个连接到第二个,一个到多个。 第二个连接到第三个,一个到多个。
我们想使用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列。
如有必要,请随时提问。
感谢您的帮助和快速回答。
答案 0 :(得分: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; }
}
我能够将RadGrid的MasterTableView上的FilterExpression重新编写为:
TimeReportGrid.MasterTableView.FilterExpression = "(it.Dossier.BUId = " + buCombo.SelectedValue + ")";
并且该连接有效。
点击此链接,详细了解customize FilterExpression
的RadGrid方法