Динамические данные - выбор таблицы из DropDownList для скаффолдинга в GridView - PullRequest
4 голосов
/ 13 марта 2012

Я боролся с этой проблемой динамических данных 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>

Ваша помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 сентября 2012

Похоже, вы пытаетесь сделать много на одной веб-странице. Это создает сложности с типом, который вы испытываете: каждая таблица требует определенных фильтров и мета-таблиц. Попытка держать каждый элемент прямо требует нескольких переключателей и / или if ... then. Я рекомендую альтернативный подход. Вместо того, чтобы делать все это на одной странице:

  1. Создать веб-страницу для каждой таблицы
  2. Установите соответствующие фильтры и метатаблицы
  3. Скопируйте DropDownList, содержащий имена таблиц всех таблиц, на каждую веб-страницу и используйте его для перенаправления на соответствующую веб-страницу.

ASP.net Dynamic Data позволяет легко создавать веб-страницы для каждой таблицы. Вот что такое леса. При описанном выше подходе каждая веб-страница будет обрабатывать свой собственный набор проблем, которые сосредоточены на конкретной таблице.

Надеюсь, это поможет.

...