【问题标题】:DropDownList in Repeater control, can't fire SelectedIndexChangedRepeater 控件中的 DropDownList,无法触发 SelectedIndexChanged
【发布时间】:2008-10-06 19:38:45
【问题描述】:

我有一个转发器控件,在页脚中有一个 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 没有被调用。有什么想法吗?

【问题讨论】:

  • 你让它工作了吗?如果没有,请发布更多信息:aspx 源代码、当前代码背后、.net 版本(1.1/2.0/3.5)、vs.net 版本(2003/2005/2008)

标签: c# asp.net


【解决方案1】:

如果您只想触发 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.
    }

就是这样。不需要更多。

【讨论】:

  • 我发现Repeater 本身的EnableViewState="false" 阻止了为其页脚控件注册的回发处理程序的注册和执行。一旦设置为 true,简单/明显的规范就起作用了。
【解决方案2】:

如果 DropDownList 在 Repeater 中,那么要触发 SelectIndexChanged 事件,您需要在 GridView / Repeater 上禁用 EnableViewState。

例如

EnableViewState="false"

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

【讨论】:

  • 在过去三年被从 MVC 拖回 WebForms 后,我遇到了同样的问题。在网格上禁用 ViewState 是最终解决我的问题的解决方案。感谢您发布此内容。
【解决方案3】:

我认为这是因为您可能没有对回发进行数据绑定。我尚未对此进行测试,但请尝试将该代码连接到您的中继器的 ItemCreated 事件。

【讨论】:

    【解决方案4】:

    我认为问题在于下拉列表控件不在重复器内部,而是在页脚上。我不认为 reperter 的事件会触发页脚上的控件。您应该尝试将下拉控件置于中继器控件之外。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我已经尝试在标记和代码隐藏中设置 AutoPostBack。
      【解决方案6】:

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

      不过,这可能不是您的理想方案。根据您的页面正在执行的操作,您可能必须将此控件数据绑定两次。一次是让事件触发,第二次是触发事件导致转发器的数据以任何方式发生变化。

      【讨论】:

        【解决方案7】:

        确保为下拉列表启用 ViewState

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-21
          • 1970-01-01
          • 2010-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多