【问题标题】:DropDownList inside Repeater: How to handle SelectedIndexChange and get DataItem?Repeater 内的 DropDownList:如何处理 SelectedIndexChange 并获取 DataItem?
【发布时间】:2012-03-01 02:36:37
【问题描述】:

我正在将带有 AutoPostBack 的 DropDownList 放入中继器中。
(ListItems 填充在转发器的 ItemDataBound 上)

<asp:Repeater ID="rptWishlist" OnItemCommand="rptWishlist_ItemCommand" onItemDataBound="rptWishlist_ItemDataBound" runat="server">
  <ItemTemplate>
    ...
    <asp:DropDownList ID="ddlSize" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlSize_SelectedIndexChanged" />
    ...
  1. 首先,这个函数甚至没有在回发时触发

    protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e)
    {
    //This function is never called
    }

  2. DataItem 工作后如何获取它?

我做错了吗?

提前谢谢你。

【问题讨论】:

    标签: c# asp.net .net repeater


    【解决方案1】:

    要为回发注册下拉列表,请添加以下代码:

     protected virtual void RepeaterItemCreated(object sender, RepeaterItemEventArgs e)
        {
            DropDownList MyList = (DropDownList)e.Item.FindControl("ddlSize");
            MyList.SelectedIndexChanged += ddlSize_SelectedIndexChanged;
        }
    

    在您的 aspx 文件中,将其添加到您的转发器标记中:

    OnItemCreated="RepeaterItemCreated"
    

    然后,在您的 ddlSize_SelectedIndexChanged 函数中,您可以像这样访问父控件:

       DropDownList d = (DropDownList)sender;
       (RepeaterItem) d.Parent...
    

    希望这会有所帮助。

    【讨论】:

    • 非常感谢!那么如何获取 DropDownList 所属的 DataItem 呢?
    • DataItem 仅在 ItemCreated 和 ItemDataBound 方法中可用。我认为您需要做的是向转发器添加一些控件,您可以使用它来引用您想要检索的项目。
    • 为什么不OnSelectedIndexChanged="ddlSize_SelectedIndexChanged"
    【解决方案2】:

    我认为您发布的代码部分没有问题。

    当 IsPostBack 为真时以及在 PageLoad 期间,您是否在中继器上调用 DataBind()? 如果是这样,您将丢失 DDL 上的 SelectedIndexChanged

    您应该存储 ID,例如在值或 HiddenField 中,以在回发处理期间加载特定的 DataItems(ListView 有 DataKey 用于此目的)

    作为一般准则:

    • 在 PreRender 期间调用 DataBind() 通常会更好
    • 如果基础数据未更改,则不应在回发期间调用 DataBind()
    • 如果你做到以上两点,你将无法使用DataItems item_created(因为您的 DataItems 仅在您调用时可用 数据绑定())

      protected void Page_Load(object sender, EventArgs e)
      {
          this.PreRender += new EventHandler(test_PreRender);
      }
      
      void test_PreRender(object sender, EventArgs e)
      {
          if (!IsPostBack)
          {
              rptWishlist.DataSource = new int[] { 1, 2, 3, 4 };
              rptWishlist.DataBind();
          }
      }
      
      protected void rptWishlist_ItemCommand(object sender, RepeaterCommandEventArgs e)
      {
          //Command Code Here
      }
      
      protected void rptWishlist_ItemDataBound(object sender, RepeaterItemEventArgs e)
      {
          var i = (int) e.Item.DataItem;
          var ddl = (DropDownList)e.Item.FindControl("ddlSize");
          for(int j=1; j<=i;j++)
          {
              ddl.Items.Add(new ListItem(){Text = j.ToString()});
      
          }
      }
      
      protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e)
      {
          Response.Write("changed");
      }
      

    【讨论】:

      【解决方案3】:

      这里的答案很好,但缺少一个关键检查。如果您想知道为什么没有将对象引用设置为对象错误的实例,请务必注意中继器将在任何数据项之前首先创建其 HEADER。

      执行此检查:

      protected void rptProjects_ItemCreated(object sender, RepeaterItemEventArgs e)
      {
           if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
           {
                 ((DropDownList)e.Item.FindControl("yourcontrol")).SelectedIndexChanged += ddlAction_SelectedIndexChanged;
           }
      }
      

      【讨论】:

        【解决方案4】:

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

        就是这样。现在将调用您的事件。

        【讨论】:

          【解决方案5】:

          试试这个

          DropDownList drp = sender as DropDownList;
              int RepeaterItemIndex = ((RepeaterItem)drp.NamingContainer).ItemIndex;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-28
            相关资源
            最近更新 更多