2010-04-05 10 views
2

J'ai 2 GridViews, le InnerGridView est imbriqué dans un TemplateField de mon OuterGridView. Chaque GridView a une ObjectDataSource (ODS). Je souhaite qu'InnerGridView affiche les données uniques au GroupName répertorié dans OuterGridView. J'ai été Googling cela pendant des semaines, voyant diverses idées basées sur RowDataBound et l'événement de sélection ODS.Comment remplir un gridview interne basé sur la sélection gridview externe (ASP.NET/C#)

Je ne pense pas que RowDataBound soit la réponse, car l'événement de sélection pour InnerGridView ODS a déjà été appelé lorsque RowDataBound est appelé pour OuterGridView.

Donc, je dois envoyer un paramètre à l'ODS pour le InnerGridView:

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

Note: Cette méthode est affectée à l'événement Sélection de l'ODS InnerGridView.

Ma question est: Comment puis-je accéder à GroupName à partir de OuterGridView ... pendant le traitement de InnerGridView. Voici un exemple de quelque chose qui ne fonctionne pas: OuterGridView.SelectedRow.FindControl ("GroupName") .ToString();

J'ai entendu que l'on peut trouver n'importe quel contrôle depuis l'intérieur de l'événement de sélection en cherchant une certaine hiérarchie. Mais je ne sais pas comment accéder à cette hiérarchie en utilisant les paramètres "e" ou "expéditeur". Si je pouvais trouver une explication des différents objets et contrôles ... et où ils ont une portée valide et comment ils sont accédés ... ce serait utile.

Un grand merci, Paul

Répondre

0

si vous lancez l'objet émetteur à un objet en gridview puis utilisez la SelectedRow comme ici et obtenir le nom de groupe?

0

Si vous voulez lier le GridView intérieur par rapport à GroupName de GridView extérieur procédez comme suit

1) if (! IsPostBack) Liez l'extérieur GridView. 2) Dans l'extérieur GridViews RowDataBound Event Trouver GridView interne en vérifiant l'état si (e.Row.RowType == DataControlRowType.DataRow) { DataRowView DRV = ((DataRowView) e.Row.DataItem); GridView InnerGridView = (GridView) e.Row.FindControl ("InnerGridView"); si (InnerGridView! = Null) { chaîne GroupName = drv ["GroupName"]; // pour obtenir le nom de groupe. InnerGridView.DataSource = "Interroger WRT le nom de groupe"; InnerGridView.DataBind(); } }

0

Espérons que les suivants aide

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

code Derrière:

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

} 

Notez l'utilisation d'une clé de données pour tenir les détails du groupe de produits.

De toute évidence, vous devrez configurer vos sources de données d'objets et les connecter aux vues de grille si nécessaire.

Ceci est adapté de this article décrivant les grilles d'imbrication à l'aide d'une source de données SQL, mais le cycle de vie de la page doit être le même.