Я боролся с этой проблемой динамических данных ASP.NET уже несколько дней ... У меня есть DropDownList, содержащий имена таблиц всех таблиц в моем файле контекста данных (.dbml). Когда я выбираю DropDownList, он должен пометить выбранную таблицу в GridView. Мой код работает на 100% в создании мета-таблицы в GridView (он реализует все правила, которые я применял в своих мета-классах).
Однако фильтрация работает, только если я явно добавляю DynamicExpression в объявлении QueryExtender:
<asp:QueryExtender ID="GridQueryExtender" TargetControlID="GridDataSource" runat="server">
<asp:DynamicFilterExpression ControlID="FilterRepeater" />
</asp:QueryExtender>
Это, в свою очередь, требует от меня явного указания MetaTable в LinqDataSource (linqdsData), либо программно в Page_Load, либо в синтаксисе ASP.NET.
Так как GridView получает поддержку в части Page_Load жизненного цикла, описанный выше подход не работает для меня, поскольку он имеет место в части Page_Init жизненного цикла.
Таким образом, мое требование заключается в том, что как только я выберу другую таблицу для заполнения GridView из DropDownList, FilterRepeater должен отразить фильтры вновь выбранного MetaTable.
Можно ли как-нибудь программно обновить FilterRepeater в Page_Load, чтобы он содержал фильтры метатаблицы, которые я выбрал в DropDownList.
Вот мой код:
Код страницы ASP.NET:
protected void Page_Load(object sender, EventArgs e)
{
if (ddlTable.SelectedIndex > 0)
{
string tableName = ddlDataType.SelectedValue;
linqdsData.TableName = tableName;
MetaTable mt = ASP.global_asax.DefaultModel.GetTable(tableName);
GridViewData.SetMetaTable(mt, mt.GetColumnValuesFromRoute(Context));
GridViewData.EnableDynamicData(mt.EntityType);
GridViewData.DataSourceID = linqdsData.ID;
}
}
Страница ASP.NET:
<asp:Panel runat="server" ID="pnlFilters" CssClass="gridFilterCon" EnableTheming="True">
<div class="filterGridHeading">
Filter the grid by:</div>
<asp:QueryableFilterRepeater runat="server" ID="FilterRepeater">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("DisplayName") %>' OnPreRender="Label_PreRender"
CssClass="gridFilterLbl" />
<asp:DynamicFilter runat="server" ID="DynamicFilter" />
<br />
</ItemTemplate>
</asp:QueryableFilterRepeater>
<asp:Button ID="btnFilter" runat="server" Text="OK"
EnableTheming="False" UseSubmitBehavior="False" OnClick="btnFilter_Click" />
</asp:Panel>
<asp:GridView ID="GridViewData" runat="server" OnSelectedIndexChanged="GridViewData_SelectedIndexChanged"
OnPreRender="GridViewData_PreRender" OnRowDataBound="GridViewData_RowDataBound"
OnPageIndexChanged="GridViewData_PageIndexChanged" AllowPaging="True" PageSize="50" OnInit="GridViewData_Init">
<Columns>
...
</Columns>
<PagerTemplate>
<asp:GridViewPager ID="GridViewPager1" runat="server" />
</PagerTemplate>
<PagerSettings Mode="NumericFirstLast" NextPageText="Next" />
</asp:GridView>
<asp:LinqDataSource ID="linqdsData" runat="server" ContextTypeName="pdcDataContext"
OnSelected="linqdsData_Selected" OnSelecting="linqdsData_Selecting" EnableUpdate="True">
</asp:LinqDataSource>
<asp:QueryExtender ID="GridQueryExtender" TargetControlID="linqdsData" runat="server">
</asp:QueryExtender>
Ваша помощь будет принята с благодарностью.