Как заполнить внутренний вид сетки на основе выбора внешнего вида сетки (ASP.NET/C#) - PullRequest
2 голосов
/ 05 апреля 2010

У меня есть 2 GridView, InnerGridView вложен в TemplateField моего OuterGridView. Каждый GridView имеет ObjectDataSource (ODS). Я хочу, чтобы InnerGridView отображал уникальные данные в GroupName, который указан в OuterGridView. Я гуглил это неделями, увидеть различные идеи, основанные на RowDataBound и событии ODS Selecting.

Я не думаю, что RowDataBound является ответом, потому что событие Selecting для InnerGridView ODS уже был вызван, когда вызывается RowDataBound для OuterGridView.

Итак, мне нужно отправить параметр в ODS для InnerGridView:

protected void ProductDataSource_Selecting( object sender, ObjectDataSourceSelectingEventArgs e ) {
        e.InputParameters["productGroup"] = <here I need to access the GroupName from the OuterGridView>;
}

Примечание. Этот метод назначается событию Selecting InnerGridView ODS.

Мой вопрос: как мне получить доступ к GroupName из OuterGridView ... во время обработки InnerGridView. Вот пример чего-то, что не работает: OuterGridView.SelectedRow.FindControl ("GroupName") .ToString ();

Я слышал, что можно найти любой элемент управления внутри события Selecting путем поиска в определенной иерархии. Но я не знаю, как получить доступ к этой иерархии, используя "e" или "отправитель" parms. Если бы я мог найти объяснение различных объектов и элементов управления ... и где они имеют действительную область видимости и как к ним обращаются ... это было бы полезно.

Большое спасибо, Пол

Ответы [ 3 ]

0 голосов
/ 27 апреля 2011

Если вы хотите привязать Inner GridView к GroupName Outer GridView, выполните следующие шаги

1) if (! IsPostBack) Bind Outer GridView. 2) Во внешнем событии GridViews RowDataBound найдите внутренний GridView, проверив условие if (e.Row.RowType == DataControlRowType.DataRow) { DataRowView drv = ((DataRowView) e.Row.DataItem); GridView InnerGridView = (GridView) e.Row.FindControl ("InnerGridView"); if (InnerGridView! = null) { string GroupName = drv ["GroupName"]; // чтобы получить GropName. InnerGridView.DataSource = "Запрос WRT имя_группы"; InnerGridView.DataBind (); } }

0 голосов
/ 27 апреля 2011

Надеемся, что следующие подсказки

Страница ASPX:

    <asp:ObjectDataSource ID="ODS1" runat="server"></asp:ObjectDataSource>
    <asp:GridView ID="GV1" runat="server" DataKeyNames="productGroup" 
        onrowdatabound="GV1_RowDataBound">
        <Columns>
            <asp:TemplateField>

                <ItemTemplate>
                    <asp:ObjectDataSource ID="ODS2" runat="server">
                    </asp:ObjectDataSource>
                    <asp:GridView ID="GV2" runat="server">
                    </asp:GridView>
                </ItemTemplate>

            </asp:TemplateField>
        </Columns>
    </asp:GridView>

Код сзади:

protected void GV1_RowDataBound(object sender, GridViewRowEventArgs e)
{
      if(e.Row.RowType == DataControlRowType.DataRow)
      {
         string productgroup = ((GridView)sender).DataKeys[e.Row.RowIndex]["productGroup"].ToString();
         ObjectDataSource objDS = (ObjectDataSource)e.Row.FindControl("ODS2");
         objDS.SelectParameters["productGroup"].DefaultValue = productgroup;
      }

}

Обратите внимание на использование ключа данных для хранения сведений о группе продуктов.

Очевидно, что вам необходимо настроить источники данных объектов и при необходимости подключить их к сеточным представлениям.

Это адаптировано из этой статьи , описывающей вложенные сеточные представления с использованиемИсточник данных SQL, но жизненный цикл страницы должен быть таким же.

0 голосов
/ 30 марта 2011

если вы приведете объект-отправитель к объекту gridview en, тогда используйте SelectedRow , как здесь, и получите имя группы?

...