2013-05-03 3 views
0

История: У нас есть 3 разных стола. TimeReport, Досье, BU Первый подключен ко второму, одному ко многим. Второй подключен к третьему, одному ко многим. see picture db.pngФильтрация неисправностей Сетка

Мы хотели использовать радиоизлучающий компонент для отображения «TimeReports». Мы построили фильтры, например, для «DossierId» и отобразили свойство «Описание». Это прекрасно работает.

Наша проблема заключается в том, что мы хотим отображать и фильтровать, например, 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() в исходном запросе, который загружает сетку, чтобы таблицы, которые вы хотите фильтровать, доступны в отключенной коллекции, которая фильтруется.


Пример кода - с кодом первая 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; } 

} 

Я могу повторно написать FilterExpression на MasterTableView в RadGrid к:

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

и эта подключение работает.

Проверить эту ссылку для получения дополнительной информации о том, как customize FilterExpression для RadGrid

Смежные вопросы