2012-06-04 9 views
8

私はasp:repeaterアイテムテンプレートの中にドロップダウンリストを持っています。 ボタンクリックイベントでその値を取得する方法はありますか。ボタンのクリックイベントでasp:repeaterのコントロールを見つけよう

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

上記のコードは初めて動作していますが、ポストバック後にddlWorkflowMembersは常にnullのままです。

+0

ですポストバック後に 'WorkflowListAfter.DataBind()'を実行していますか? –

+0

番号。ちょうどWorkflowListAfterItemCreated(){...} – mhesabi

答えて

20

BtnSaveがリピータの内部にあると仮定します。

ボタンNamingContainerをキャストしてRepeaterItemを取得します。次に、あなたのDropDownListへの参照を取得するためにFindControlを使用することができます。

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

ボタンがリピータの外にある、あなたはすべての項目を保存したい場合は、あなたがすべてをループする必要があります。

protected void BtnSaveClick(object sender, EventArgs e) { 
    foreach(RepeaterItem item in WorkflowListAfter.Items) 
    { 
     var ddl = (DropDownList) item.FindControl("ddlWorkflowMembers"); 
     // ... 
    }  
} 
関連する問題