4

I have been struggling with this ASP.NET Dynamic Data problem for days now... I have a DropDownList containing the table names of all the tables in my data context (.dbml) file. When I select the DropDownList, it needs to scaffold the selected table in a GridView. My code works 100% in scaffolding the MetaTable in the GridView (it implements all the rules that I applied in my Meta Classes).

However, filtering only seems to work if I explicitly add the DynamicExpression in the declaration of the QueryExtender:

<asp:QueryExtender ID="GridQueryExtender" TargetControlID="GridDataSource" runat="server">
    <asp:DynamicFilterExpression ControlID="FilterRepeater" />
</asp:QueryExtender>

This in turn requires me to specify the MetaTable explicitly in the LinqDataSource (linqdsData), either programmatically in the Page_Load or in the ASP.NET syntax.

Since the GridView gets scaffolded in the Page_Load part of the life-cycle, the above approach does not work for me, since it takes place in the Page_Init part of the life-cycle.

So my requirement is that as soon as I select another table to populate the GridView with from the DropDownList, the FilterRepeater needs to reflect the filters of the newly selected MetaTable.

Is there any way for me to programmatically update the FilterRepeater in the Page_Load so that it will contain the filters of the MetaTable that I selected in the DropDownList.

The following is some of my code:

ASP.NET Page Code-Behind:

 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 Page:

<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>

Your help will be greatly appreciated.

Curious Coder
  • 177
  • 1
  • 11

1 Answers1

0

It sounds like you are trying to do a lot on one web page. This creates complications of the type you are experiencing: each table requires distinct filters and MetaTables. Trying to keep each item straight requires a bunch of switch and/or if...then statements. I recommend an alternate approach. Instead of doing all of this on one page:

  1. Create a web page for each table
  2. Setup the appropriate filters and MetaTables
  3. Copy the DropDownList containing the table names of all the tables to each web page, and use it to redirect to the appropriate web page.

ASP.net Dynamic Data makes it easy to create web pages for each table. That is what scaffolding is all about. With the approach above, each web page will handle its own set of concerns that are focused on the particular table.

Hope this helps.

Tarzan
  • 4,270
  • 8
  • 50
  • 70