我已经为这个ASP.NET动态数据问题挣扎了好几天.我有一个DropDownList,它包含数据上下文(.dbml)文件中所有表的表名。当我选择DropDownList时,它需要在GridView中搭建所选表的支架。我的代码100%工作在脚手架上,MetaTable在GridView中(它实现了我在元类中应用的所有规则)。
但是,只有当我在DynamicExpression的声明中显式地添加QueryExtender时,过滤才能工作:
<asp:QueryExtender ID="GridQueryExtender" TargetControlID="GridDataSource" runat="server">
<asp:DynamicFilterExpression ControlID="FilterRepeater" />
</asp:QueryExtender>这就要求我在LinqDataSource (LinqdsData)中显式地指定LinqDataSource (linqdsData),无论是以编程方式在Page_Load中还是在ASP.NET语法中。
由于GridView在生命周期的Page_Load部分中被脚手架化,所以上面的方法对我不起作用,因为它发生在生命周期的Page_Init部分。
因此,我的要求是,一旦我从DropDownList中选择另一个表来填充DropDownList,FilterRepeater就需要反映新选择的MetaTable的过滤器。
是否有任何方式以编程方式更新FilterRepeater中的Page_Load,以便它包含我在DropDownList中选择的MetaTable过滤器。
以下是我的一些代码:
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>你的帮助将不胜感激。
发布于 2012-09-11 14:05:45
听起来你想在一个网页上做很多事情。这就造成了您正在经历的类型的复杂性:每个表都需要不同的过滤器和MetaTables。要想使每一项保持清晰,需要一串开关和/或if...then语句。我建议采用另一种方法。与其在一页上进行所有这些操作,不如:
MetaTables
ASP.net动态数据使得为每个表创建网页变得很容易。这就是脚手架的意义所在。按照上述方法,每个网页将处理自己的一组关注事项,这些关注集中在特定的表上。
希望这能有所帮助。
https://stackoverflow.com/questions/9683591
复制相似问题