如何在页面加载时向ASP.NET控件添加事件?

时间:2011-02-24 12:03:42

标签: c# asp.net webforms

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

但是eachControl的所有内容都是一个转发器,并且它将childcontrol计数显示为0.因此当它到达FindControl方法时,它总是返回null。

问题 所以我要做的是将一个事件(OnSelectedItemChange)添加到转发器内的dropdownlist控件(如果满足条件,这是一个自定义控件,将添加到页面中)。当在下拉列表中进行选择时,我希望它触发Event方法。

我怎么能:

A)如果页面上存在下拉列表控件,找到添加事件的方法吗?

OR

B)一种能够在后面的代码中调用方法并从所有下拉列表中传递选择的方法(因为自定义控件可以多次添加创建多个下拉列表?

注意我没有在我面前的代码,所以如果我的语法不正确,请忽略。我也知道ID是唯一的,所以这也被认为是我的逻辑问题。当它呈现这些时,ID可能会被asp名称约定所破坏,我认为我必须找到解决办法。

2 个答案:

答案 0 :(得分:2)

如果您在自定义控件上创建该事件,则无需检查页面上是否存在该事件。如果是这样,它肯定会触发事件。或者我在这里遗漏了什么?


<小时/> 修改

您需要做的是在您的控件上声明一个公共事件,然后当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);
}

这应该有效。

答案 1 :(得分:2)

假设您无法将此逻辑放在控件本身中,我认为您需要做的是访问该转发器并将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
     }
}

我没有时间在这一刻尝试,但我怀疑这应该有效。