Как добавить событие в элемент управления ASP.NET при загрузке страницы? - PullRequest
0 голосов
/ 24 февраля 2011

ASP.Net веб-форм, .NET 2.0

У меня дилемма. У меня есть страница aspx, которая имеет пользовательский элемент управления:

<def:CustomControl ID="customID" runat="server" />

Пользовательский элемент управления можно добавить несколько раз на страницу ASPX, если соблюдены определенные критерии:

<asp:Repeater runat="server" ID="options" OnItemDataBound="options_OnItemDataBound">
    <HeaderTemplate>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tr>
    </HeaderTemplate>
    <ItemTemplate>
                <td>
                    <span>
                        <asp:Label runat="server" ID="optionName">
                        </asp:Label>
                        <asp:DropDownList runat="server" ID="optionValues" CssClass="PartOption" >
                        </asp:DropDownList>
                    </span>
                </td>
    </ItemTemplate>
    <FooterTemplate>
            </tr>
        </table>
    </FooterTemplate>
</asp:Repeater>

В коде страницы aspx я хотел добавить событие (OnSelectedItemChange) в выпадающий элемент управления, которого на самом деле нет на странице ASPX (пока). Тем не менее, когда я пытаюсь сделать что-то вроде следующего в коде:

foreach(Control eachControl in customID.Controls) {
    if (eachControl.HasControls) {
        Control DdControl = eachControl.FindControl("optionValues");  //always null

        if (DdControl != null && DdControl is typeOf(DropDownList)) {
            DdControl = DdControl as DropDownlist;  //I might have the syntax wrong
                                                    //here, but you get the point.

             //add event to control.
        }
    }
}

Но все, что есть у каждого элемента управления - это ретранслятор, и он показывает количество дочерних элементов как 0. Поэтому, когда он попадает в метод FindControl, он всегда возвращает ноль.

ВОПРОС Так что я пытаюсь сделать, это добавить событие (OnSelectedItemChange) в элемент управления dropdownlist внутри повторителя (который является пользовательским элементом управления, который добавляется на страницу при соблюдении критериев). Когда в выпадающем списке делается выбор, я хочу, чтобы он вызвал метод Event.

Как я могу:

А) Найти способ добавить событие, если на странице существует элемент управления выпадающего списка?

OR

B) Способ вызова метода из кода и передачи выбора из всех раскрывающихся списков (поскольку пользовательский элемент управления может быть добавлен более одного раза, создавая несколько раскрывающихся списков?

ПРИМЕЧАНИЕ У меня нет кода передо мной, поэтому, если у меня есть что-то синтаксически неправильное, пожалуйста, не обращайте внимания. Я также знаю, что идентификаторы уникальны, поэтому это также считается проблемой с моей логикой. Когда он отображает их, идентификаторы могут быть искажены соглашением об именах asp, которое, как я полагаю, я должен найти способ обойти.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Предполагая, что вы не можете поместить эту логику в сам элемент управления, я думаю, вам нужно получить доступ к этому повторителю и прикрепить к нему событие ItemDataBound. Примерно так:

Repeater options = customID.FindControl("options") as Repeater;
if (options != null)
{
    options.ItemDataBound += new RepeaterItemEventHandler(OptionsItemDataBound);
}

Затем в событии ItemDataBound вы должны сделать что-то вроде этого:

void OptionsItemDataBound(object sender, RepeaterItemEventArgs e)
{
     DropDownList optionValues = e.Item.FindControl("optionValues") as DropDownList;
     if (optionValues != null)
     {
         //perform logic you need here
     }
}

У меня нет времени, чтобы попробовать это прямо сейчас, но я подозреваю, что это должно сработать.

2 голосов
/ 24 февраля 2011

Если вы создаете это событие в пользовательском элементе управления, вам не нужно проверять, существует ли оно на странице или нет. Если это произойдет, это определенно вызовет событие. Или я что-то здесь упускаю?



EDIT:

То, что вам нужно сделать, это объявить публичное событие на вашем элементе управления, а затем при возникновении события SelectedIndexChanged вы запустите это событие и получите его на странице.

Так что под вашим контролем у вас будет:

public delegate void MyIndexChangedDelegate(string value);
public event MyIndexChangedDelegate MyEvent;

protected void myDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
    MyEvent(myDropDown.SelectedValue); // Or whatever you want to work with.
}

Тогда на вашей странице, в вашей контрольной декларации у вас будет:

<usc:control1 runat="server" OnMyEvent="EventReceiver" />

И по коду позади:

protected void EventReceiver(string value)
{
    // Do what you have to do with the selected value, which is our local variable 'value'
    ClientScript.RegisterStartupScript(typeof(Page), "Alert", string.Format("<script language='JavaScript'>alert('User selected value {0} on my DropDown!');</script>"), value);
}

Это должно сработать.

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