簡體   English   中英

Repeater中的DropDownList:如何處理SelectedIndexChange並獲取DataItem?

[英]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" />
    ...
  1. 首先,這個功能甚至沒有在回發后被解雇

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

這里的答案很好,但錯過了一個重要的檢查。 如果您想知道為什么您沒有將對象引用設置為對象錯誤的實例,請務必注意轉發器將在任何數據項之前首先創建其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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM