2012-06-04 26 views
8

Ho un elenco a discesa all'interno di un asp: modello di elemento ripetitore. come posso ottenere il suo valore sull'evento click del pulsante.Trova controllo in asp: ripetitore sul pulsante clic evento

<asp:Repeater runat="server" ID="WorkflowListAfter" onitemcreated="WorkflowListAfterItemCreated"> 
    <ItemTemplate> 
     <asp:DropDownList ID="ddlWorkflowMembers" runat="server" DataTextField="MemberName" DataValueField="MemberID"> 
    </ItemTemplate> 
</asp:Repeater> 

protected DropDownList ddlWorkflowMembers = new DropDownList(); 
protected void WorkflowListAfterItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    ddlWorkflowMembers = (DropDownList) e.Item.FindControl("ddlWorkflowMembers"); 
} 
protected void BtnSaveClick(object sender, EventArgs e) { 
    if (ddlWorkflowMembers.SelectedItem == null) return; 
} 

codice sopra funziona a prima volta ma dopo ddlWorkflowMembers postback è sempre expersion nullo.

+0

Are stai facendo 'WorkflowListAfter.DataBind()' dopo il postback? –

+0

no. solo su WorkflowListAfterItemCreated() {...} – mhesabi

risposta

20

Supponendo che BtnSave si trovi anche all'interno del ripetitore.

Ottiene il RepeaterItem lanciando il pulsante NamingContainer. Quindi è possibile utilizzare FindControl per ottenere il riferimento al vostro DropDownList:

protected void BtnSaveClick(object sender, EventArgs e) { 
    var btn = (Button)sender; 
    var item = (RepeaterItem)btn.NamingContainer; 
    var ddl = (DropDownList) item.FindControl("ddlWorkflowMembers"); 
    // ... 
} 

Se il pulsante è al di fuori del ripetitore e si desidera salvare tutti gli elementi, è necessario il ciclo di tutti:

protected void BtnSaveClick(object sender, EventArgs e) { 
    foreach(RepeaterItem item in WorkflowListAfter.Items) 
    { 
     var ddl = (DropDownList) item.FindControl("ddlWorkflowMembers"); 
     // ... 
    }  
} 
Problemi correlati