2 votes

ASP Gridview drop down list selection changed, comment remplir une liste déroulante autrement que dans rowDataBound()

J'ai un gridview en ASP, ayant template Fields contenant select , edit y delete lie chaque ligne, et le pied de page contenant insert lien.

Il y a deux dropdownlists dans chaque rangée, disons : Category y sub-category lorsque je modifie le contenu du fichier category DropDownList le site sub-category DropDownList devrait automatiquement afficher le contenu correspondant.

J'ai essayé d'écrire un onSelectedIndexChanged handler, mais je ne sais pas comment continuer. Des idées ? (en gardant à l'esprit que j'ai fait tous les codes rowDataBound() pour remplir les listes déroulantes)

En d'autres termes, comment alimenter une liste déroulante autrement que par row_databound() ?

code :

protected void grdBulkScheduler_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        try
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {   
                DropDownList ddlCategory = (DropDownList)e.Row.FindControl("ddlCategory");
                if (ddlCategory != null)
                {
                    ddlCategory .DataSource = cData.GetCategory();
                    ddlCategory .DataValueField = "c_ID";
                    ddlCategory .DataTextField = "c_Text";
                    ddlCategory .DataBind();                    
                }

Je trouve ici la liste déroulante catégorie de GridViewRowEventArgs

dans le gestionnaire selectedIndexChanged, comment puis-je trouver la liste déroulante ? depuis DropDownList ddlCategory = (DropDownList)e.Row.FindControl("ddlCategory") ne fonctionne pas

2voto

AGuyCalledGerald Points 2304

Il semble que vous vouliez lier des données à la liste déroulante des sous-catégories en utilisant la valeur que vous avez sélectionnée dans la liste déroulante des catégories. Vous pouvez le faire :

protected void ddlCategory_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow row = (GridViewRow)((DropDownList)sender).Parent.Parent;
    DropDownList ddlSubCategory = (DropDownList)row.FindControl("ddlSubCategory");
    ddlSubCategory.DataSource = //whatever you want to bind, e.g. based on the selected value, using((DropDownList)sender).SelectedValue;
    ddlSubCategory.DataBind();
}

Si je vous ai mal compris, veuillez me corriger dans un commentaire.

1voto

Sean Airey Points 6272

FindControl n'est pas récursif et vous avez un nombre de TableCell les contrôles dans le Cells sur votre GridViewRow avant d'arriver au niveau où se trouve votre contrôle, donc le changer en quelque chose comme ceci fonctionnera :

TableCell cell = (TableCell)e.Row.FindControl("idOfMyCellIfItHasOne");
DropDownList ddlCategory = (DropDownList)cell.FindControl("ddlCategory");

Alternativement, si votre cellule/colonne n'a pas d'ID et/ou si vous savez que la position de la cellule dans le tableau ne va pas changer, vous pouvez utiliser l'indexeur sur la balise Cells propriété :

DropDownList ddlCategory = (DropDownList)e.Row.Cells[cellIndex].FindControl("ddlCategory");

0voto

elfekz Points 1328

À utiliser dans votre liste déroulante AutoPostBack="true"

comme ça :

 <asp:DropDownList ID="footer_id"  AutoPostBack="true" 
 OnSelectedIndexChanged="footer_id_SelectedIndexChanged" 
 runat="server"></asp:DropDownList>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X