[英]DropDownList inside Repeater: How to handle SelectedIndexChange and get DataItem?
我將一個DropDownList與AutoPostBack放在Repeater中。
(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" />
...
首先,這個功能甚至沒有在回發后被解雇
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)
作為一般准則:
如果您執行上述兩點,則無法在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"); }
這里的答案很好,但錯過了一個重要的檢查。 如果您想知道為什么您沒有將對象引用設置為對象錯誤的實例,請務必注意轉發器將在任何數據項之前首先創建其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;
}
}
如果你只想激活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.
}
就是這樣。 您的活動現在將被調用。
嘗試這個
DropDownList drp = sender as DropDownList;
int RepeaterItemIndex = ((RepeaterItem)drp.NamingContainer).ItemIndex;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.