Repeater中的DropDownList:如何处理SelectedIndexChange并获取DataItem?

我将一个DropDownList与AutoPostBack放在Repeater中。
(ListItems填充在转发器的ItemDataBound上)

  ...  ... 
  1. 首先,这个function甚至没有在回发后被解雇

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

  2. 在我开始工作之后,我将如何获得DataItem?

我这样做是错误的吗?

先感谢您。

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

  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... 

希望这可以帮助。

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

当IsPostBack为true并且在PageLoad期间,您是否在转发器上调用DataBind()? 如果是这样,您将丢失DDL上的SelectedIndexChanged

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

作为一般准则:

  • 在PreRender期间调用DataBind()通常会更好
  • 如果底层数据没有改变,你不应该在回发期间调用DataBind()
  • 如果您执行上述两点,则无法在item_created中使用DataItem(因为只有在调用DataBind()时,DataItem才可用)

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

如果你只想激活OnSelectedIndexChanged,它应该是这样的:

Page.aspx – 来源

   Option1 Option2   

Page.aspx.cs – 代码隐藏

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

就是这样。 您的活动现在将被呼叫。

这里的答案很好,但错过了一个重要的检查。 如果您想知道为什么没有将对象引用设置为对象错误的实例,请务必注意转发器将在任何数据项之前首先创建其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; } } 

试试这个

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