Assigning an Event to a Custom Control Inside a Repeater Control

I have a Repeater control, which in some of its cells contains a UserControl that contains a DropDownList. In the ItemDataBound event of the Repeater element, I assign the DropDownList event as follows:

protected void MyRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)  
{  
...  
MyControl myControl = (MyControl)e.Item.FindControl("MyControl01");  
myControl.DataSource = myObject;  
myControl.DataBind();  
myControl.DropDownList.SelectedItemChange += MyMethod_SelectedIndexChanged;  
myControl.DropDownList.AutoPostBack = true;  
....  
}  

protected void MyMethod_SelectedIndexChanged(object sender, EventArgs e)  
{  
//Do something.  
}

The event never fires. Please, I need some help.

+2
source share
3 answers

Your event is not created in PostBack because your event handler was not attached (it is attached only during the iteration of the page life cycle, when your relay is a database binding).

If you attach an event handler declaratively in the markup, for example:

<asp:Repeater ID="Repeater1" runat="server">
     <ItemTemplate>
         <asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
    </ItemTemplate>
</asp:Repeater>

PostBacks.

+6

, , :

  • MyRepeater , ! IsPostBack.
  • Bind MyRepeater OnInit.

1) , , ASP.NET , .

2) OnInit, OnLoad.

+1

, .

, ItemTemplate

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ListBoxContainer.ascx.cs" Inherits="OAAF.Common.ListBoxContainer" %>

<asp:ListBox ID="lstFromControl" runat="server" Rows="1" DataTextField="Text" DataValueField="Id" OnSelectedIndexChanged="LstFromControl_SelectedIndexChanged" AutoPostBack="true" />

, ItemTemplate

public partial class ListBoxContainer : System.Web.UI.UserControl
{
    //declare the event using EventHandler<T>
    public event EventHandler<EventArgs> ListBox_SelectedIndexChanged;

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void LstFromControl_SelectedIndexChanged(object sender, EventArgs e)
    {
        //fire event: the check for null sees if the delegate is subscribed to
        if (ListBox_SelectedIndexChanged != null)
        {
            ListBox_SelectedIndexChanged(sender, e);
        }
    }
}

, , : ListBox_SelectedIndexChanged. , EventArgs.

, , :

<asp:Repeater ID="rptTest" runat="server">
<ItemTemplate>
    <br />
    <ctrl:wucListBox ID="listBoxControl" runat="server" OnListBox_SelectedIndexChanged="ListBoxControl_SelectedIndexChanged" />
</ItemTemplate>    
</asp:Repeater>

, ,

<%@ Register Src="~/Common/ListBoxContainer.ascx" TagName="wucListBox" TagPrefix="ctrl" %>

ListBox_SelectedIndexChanged, , , , .

    protected void ListBoxControl_SelectedIndexChanged(object sender, EventArgs e)
    {
        //some code
    }
+1
source

All Articles