Назначить событие для пользовательского элемента управления внутри элемента управления Repeater - PullRequest
2 голосов
/ 21 января 2009

У меня есть элемент управления Repeater, который в некоторых его ячейках содержит UserControl, который содержит DropDownList. В событии ItemDataBound элемента управления Repeater я назначаю событие DropDownList следующим образом:

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

Событие никогда не начинается. Пожалуйста, мне нужна помощь.

Ответы [ 3 ]

6 голосов
/ 21 января 2009

Ваше событие не вызывается в PostBack, потому что ваш обработчик событий не был прикреплен (он присоединяется только во время итерации жизненного цикла страницы, когда ваш ретранслятор привязан к данным).

Если вы прикрепите обработчик событий декларативно в разметке, например:

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

Тогда ваш обработчик событий будет вызываться во время PostBacks.

1 голос
/ 21 января 2009

Сначала убедитесь, что привязка данных не сбрасывает выпадающие списки.

Вот код для элемента управления, который будет вложен в повторитель 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 голос
/ 21 января 2009

Есть две вещи, которые вы можете попробовать посмотреть, поможет ли это:

  1. Попробуйте связать свой MyRepeater с каждым запросом страницы, а не только когда! IsPostBack.
  2. Bind MyRepeater внутри OnInit.

Для 1) Если динамически созданные элементы управления создаются при первой загрузке страницы, а затем снова при обратной передаче, ASP.NET заметит, что возникшее событие совпадает, и запустит событие.

Для 2) Дизайнер всегда использовал вложение событий в OnInit, хотя в OnLoad это тоже должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...