ASP:Repeater中如何在按钮单击事件中查找控件

12

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

上述代码在第一次运行时正常工作,但在后续的Postback之后,ddlWorkflowMembers始终为null异常。


你在PostBack之后执行了WorkflowListAfter.DataBind()吗? - Sergey Rybalkin
仅在WorkflowListAfterItemCreated()函数中使用{...}。 - mhesabi
1个回答

24

假设BtnSave也在重复器中。

通过将按钮的NamingContainer转换,您可以获得RepeaterItem。然后使用FindControl来获取对DropDownList的引用:

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");
        // ...
    }       
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接