2012-03-01 61 views
6

Estoy colocando una DropDownList con AutoPostBack dentro de un repetidor.
(Los ListItems se rellenan en ItemDataBound del repetidor)DropDownList dentro de Repeater: ¿Cómo manejar SelectedIndexChange y obtener DataItem?

<asp:Repeater ID="rptWishlist" OnItemCommand="rptWishlist_ItemCommand" onItemDataBound="rptWishlist_ItemDataBound" runat="server"> 
    <ItemTemplate> 
    ... 
    <asp:DropDownList ID="ddlSize" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlSize_SelectedIndexChanged" /> 
    ... 
  1. En primer lugar, esta función no era ni siquiera dispararon en el poste de vuelta

    protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e)
    {
    //This function is never called
    }

  2. ¿Cómo obtendré el DataItem después de que lo ponga en funcionamiento?

¿Estoy haciendo esto de la manera incorrecta?

Gracias de antemano.

Respuesta

12

Para registrar la lista desplegable para la devolución de datos, agregue el siguiente código:

protected virtual void RepeaterItemCreated(object sender, RepeaterItemEventArgs e) 
    { 
     DropDownList MyList = (DropDownList)e.Item.FindControl("ddlSize"); 
     MyList.SelectedIndexChanged += ddlSize_SelectedIndexChanged; 
    } 

Y en su archivo aspx, añadir esto a su margen de beneficio repetidor:

OnItemCreated="RepeaterItemCreated" 

Luego, en su función de ddlSize_SelectedIndexChanged, puede acceder al control primario de esta manera:

DropDownList d = (DropDownList)sender; 
    (RepeaterItem) d.Parent... 

Hope this hel PD.

+0

Muchas gracias! Entonces, ¿cómo obtengo el DataItem al que pertenece DropDownList? – Aximili

+1

DataItem solo está disponible en los métodos ItemCreated y ItemDataBound. Creo que lo que tendrá que hacer es agregar algo de control al repetidor que puede usar para hacer referencia al elemento que desea recuperar. – jmaglio

+0

¿Por qué no 'OnSelectedIndexChanged =" ddlSize_SelectedIndexChanged "'? – toddmo

1

Si lo que desea es disparar el OnSelectedIndexChanged, esta es la forma en que debe ser:

Page.aspx - Fuente

<FooterTemplate> 
    <asp:DropDownList ID="ddlOptions" 
      runat="server" 
      AutoPostBack="true" 
      onselectedindexchanged="ddlOptions_SelectedIndexChanged"> 
     <asp:ListItem>Option1</asp:ListItem> 
     <asp:ListItem>Option2</asp:ListItem> 
    </asp:DropDownList> 
</FooterTemplate> 

Page.aspx.cs - código subyacente

protected void ddlOptions_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //Event Code here. 
    } 

Y eso es todo. Tu evento se llamará ahora.

2

No veo ningún problema con la parte del código que ha publicado.

¿Llamas a DataBind() en tu repetidor cuando IsPostBack es verdadero y durante PageLoad? Si es así, perderá el SelectedIndexChanged en usted DDLs

Debe almacenar identificadores, por ejemplo, en valores o HiddenField, para cargar DataItems específicos durante el proceso de devolución de datos (ListView tiene DataKey para este propósito)

Como general oRIENTACIÓN:

  • a menudo es mejor llamar a DataBind() durante PreRender
  • no debe llamar a DataBind() durante la devolución de datos si los datos subyacente no ha cambiado
  • si lo hace los dos puntos anteriores, no será capaz de utilizar DataItems en item_created (como sus DataItems estarán disponibles sólo cuando se llama a DataBind())

    protected void Page_Load(object sender, EventArgs e) 
    { 
        this.PreRender += new EventHandler(test_PreRender); 
    } 
    
    void test_PreRender(object sender, EventArgs e) 
    { 
        if (!IsPostBack) 
        { 
         rptWishlist.DataSource = new int[] { 1, 2, 3, 4 }; 
         rptWishlist.DataBind(); 
        } 
    } 
    
    protected void rptWishlist_ItemCommand(object sender, RepeaterCommandEventArgs e) 
    { 
        //Command Code Here 
    } 
    
    protected void rptWishlist_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
        var i = (int) e.Item.DataItem; 
        var ddl = (DropDownList)e.Item.FindControl("ddlSize"); 
        for(int j=1; j<=i;j++) 
        { 
         ddl.Items.Add(new ListItem(){Text = j.ToString()}); 
    
        } 
    } 
    
    protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        Response.Write("changed"); 
    } 
    
1

La respuesta aquí es bueno pero falta un crucial cheque. Si se pregunta por qué obtiene la referencia de objeto no configurada para una instancia de un objeto, es importante tener en cuenta que el repetidor creará su ENCABEZADO antes de cualquier elemento de datos.

realizar esta comprobación:

protected void rptProjects_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
      ((DropDownList)e.Item.FindControl("yourcontrol")).SelectedIndexChanged += ddlAction_SelectedIndexChanged; 
    } 
} 
-1

probar este

DropDownList drp = sender as DropDownList; 
    int RepeaterItemIndex = ((RepeaterItem)drp.NamingContainer).ItemIndex; 
Cuestiones relacionadas