2012-03-01 7 views
6

Sto inserendo un DropDownList con AutoPostBack all'interno di un ripetitore.
(I ListItems sono popolati sul ItemDataBound del ripetitore)DropDownList all'interno del ripetitore: come gestire SelectedIndexChange e ottenere 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. In primo luogo, questa funzione è stata nemmeno sparato sul palo

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

  2. Come posso ottenere il DataItem dopo averlo attivato?

Sto facendo questo nel modo sbagliato?

Grazie in anticipo.

risposta

12

Per registrare il DropDownList per postback, aggiungere il seguente codice:

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

E nel file aspx, aggiungere questo al vostro markup ripetitore:

OnItemCreated="RepeaterItemCreated" 

Poi, nella funzione ddlSize_SelectedIndexChanged, è possibile accedere al controllo genitore in questo modo:

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

Spero che questo hel ps.

+0

Grazie mille! Quindi come ottengo il DataItem a cui appartiene DropDownList? – Aximili

+1

DataItem è disponibile solo nei metodi ItemCreated e ItemDataBound. Penso che quello che devi fare è aggiungere un controllo al ripetitore che puoi usare per fare riferimento all'elemento che vuoi recuperare. – jmaglio

+0

Perché non 'OnSelectedIndexChanged =" ddlSize_SelectedIndexChanged "'? – toddmo

1

Se si desidera solo per sparare l'OnSelectedIndexChanged, questo è come dovrebbe apparire:

Page.aspx - Fonte

<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 - Codice-dietro

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

E questo è tutto. Il tuo evento verrà chiamato ora.

2

Non vedo alcun problema con la parte di codice che hai postato.

Chiama DataBind() sul ripetitore quando IsPostBack è true e durante PageLoad? Se è così, si perde il SelectedIndexChanged su di voi DDL

funzione consente di memorizzare gli ID, ad esempio in valori o HiddenField, per caricare DataItems specifici durante la lavorazione postback (ListView ha DataKey per questo scopo)

Come generale linea guida:

  • spesso è meglio chiamare DataBind() durante PreRender
  • non si dovrebbe chiamare DataBind() durante il postback se i dati di fondo non è cambiata
  • se si fa i due punti di cui sopra, non sarà in grado di utilizzare DataItems in item_created (come le vostre DataItems saranno disponibili solo quando si chiama 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 risposta qui è buono ma manca un controllo cruciale. Se ti stai chiedendo perché stai ricevendo il riferimento all'oggetto non impostato su un'istanza di un oggetto, è importante notare che il ripetitore creerà il suo INTESTA prima di qualsiasi elemento di dati.

eseguire questo controllo:

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

provare questo

DropDownList drp = sender as DropDownList; 
    int RepeaterItemIndex = ((RepeaterItem)drp.NamingContainer).ItemIndex; 
Problemi correlati