在Repeater控件中DropDownList,无法触发SelectedIndexChanged

时间:2008-10-06 19:38:46

标签: c# asp.net

我有一个转发器控件,在页脚中我有一个DropDownList。在我的代码隐藏中,我有:

protected void ddMyRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item
            || e.Item.ItemType == ListItemType.AlternatingItem)
    {
       // Item binding code
    }

    else if (e.Item.ItemType == ListItemType.Footer)
    {
        DropDownList ddl = e.Item.FindDropDownList("ddMyDropDownList");
        // Fill the list control
        ddl.SelectedIndexChanged += new  
           EventHandler(ddMyDropDownList_SelectedIndexChanged);
        ddl.AutoPostBack = true;
    }
 }

该页面显示为PostBack,但我的EventHandler未被调用。有什么想法吗?

7 个答案:

答案 0 :(得分:11)

如果您只想触发OnSelectedIndexChanged,它应该是这样的:

Page.aspx - 来源

<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 - 代码隐藏

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

就是这样。不需要更多。

答案 1 :(得分:5)

如果DropDownList在Repeater中,然后激活SelectIndexChanged事件,则需要在GridView / Repeater上禁用EnableViewState。

e.g。

EnableViewState="false"

您还需要在每个回发上对GridView / Repeater进行数据绑定,以便在Page Load方法中对其进行数据绑定。

答案 2 :(得分:2)

我认为这是因为你可能不会在回发上进行数据绑定。我没有测试过这个,但是尝试将代码挂钩到转发器的ItemCreated事件上。

答案 3 :(得分:2)

我认为问题来自于dropdownlist控件不在repeter中,而是在页脚上。我不认为reperter的出现会触发页脚上的控件。您应该尝试将dropdowncontrol放在转发器控件之外。

答案 4 :(得分:1)

ASPX端DropDownLists上的AutoPostBack属性是否设置为True?我知道有时这个属性最初没有设置,它会阻止SelectedIndexChanged事件被触发。

答案 5 :(得分:1)

在这种情况下,您的父转发器(ddMyRepeater)必须在每次回发时在page_load中数据绑定。这是我发现获取嵌套控件来触发事件的唯一方法。

但这可能不适合您。根据页面的作用,您可能需要对此控件进行两次数据绑定。一旦触发事件,第二次触发事件导致转发器的数据以任何方式改变。

答案 6 :(得分:1)

确保为下拉列表启用ViewState