首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态数据--从DropDownList中选择一个表到GridView中的支架

问动态数据--从DropDownList中选择一个表到GridView中的支架
EN

Stack Overflow用户
提问于 2012-03-13 12:00:06
回答 1查看 1.2K关注 0票数 4

我已经为这个ASP.NET动态数据问题挣扎了好几天.我有一个DropDownList,它包含数据上下文(.dbml)文件中所有表的表名。当我选择DropDownList时,它需要在GridView中搭建所选表的支架。我的代码100%工作在脚手架上,MetaTable在GridView中(它实现了我在元类中应用的所有规则)。

但是,只有当我在DynamicExpression的声明中显式地添加QueryExtender时,过滤才能工作:

代码语言:javascript
复制
<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页面代码-隐藏:

代码语言:javascript
复制
 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页面:

代码语言:javascript
复制
<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>

你的帮助将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2012-09-11 14:05:45

听起来你想在一个网页上做很多事情。这就造成了您正在经历的类型的复杂性:每个表都需要不同的过滤器和MetaTables。要想使每一项保持清晰,需要一串开关和/或if...then语句。我建议采用另一种方法。与其在一页上进行所有这些操作,不如:

MetaTables

  • Copy
  1. 为每个表创建一个网页
  2. 设置适当的过滤器,并将包含所有表的表名的DropDownList传递到每个网页,并使用它重定向到适当的网页。

ASP.net动态数据使得为每个表创建网页变得很容易。这就是脚手架的意义所在。按照上述方法,每个网页将处理自己的一组关注事项,这些关注集中在特定的表上。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9683591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档