Repeater中的DropDownList:如何处理SelectedIndexChange并获取DataItem?
我将一个DropDownList与AutoPostBack放在Repeater中。
(ListItems填充在转发器的ItemDataBound上)
... ...
-
首先,这个function甚至没有在回发后被解雇
protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e)
{
//This function is never called
}
-
在我开始工作之后,我将如何获得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;