麻烦过滤网格

时间:2013-05-03 13:18:02

标签: c# asp.net telerik

故事: 我们有3个不同的表。时间报告,档案,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 个答案:

答案 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方法