【问题标题】:How do I add a event to an ASP.NET control when the page loads?如何在页面加载时向 ASP.NET 控件添加事件?
【发布时间】:2011-02-24 12:03:42
【问题描述】:

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的所有东西都是一个repeater,它显示它的childcontrol计数为0。所以当它到达FindControl方法时,它总是返回null。

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

我该怎么做:

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

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

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

【问题讨论】:

  • 首先你尝试用什么方法来执行上面的代码?其次,为什么不在自定义控件上创建一个事件。这可能不是唯一一次有人想要订阅 selectionchanged 事件
  • 你是说DropDownList的SelectedIndexChanged事件吗?
  • @LordCover - 是的。 @Rune FS - 我不确定我是否遵循。我更新了上面的自定义控件。但是由于自定义控件的代码是在单独的页面上,所以放在ASPX页面上的“控件上会影响到自定义控件Repeater中嵌入的下拉列表控件吗?

标签: c# asp.net webforms


【解决方案1】:

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



编辑:

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

应该可以的。

【讨论】:

  • 是与自定义控制逻辑类分开的页面/类的 ASPX 页面。因此,我不能将事件 (OnSelectedIndexChanged) 放在指向 ASPX 页面代码隐藏方法的下拉列表控件上(它不会知道它并且不会构建)。这就是问题的本质。
  • @pghtech 我明白了。所以我编辑了我的答案并添加了一些代码。希望它对你有用。
  • 这不起作用。而且我看不到我如何将任何东西绑定到下拉列表以应用任何逻辑。
  • @pghtech 看不到如何绑定 DropDown 是什么意思?您从 DropDown 中获得的重要信息是什么? SelectedValue,SelectedText?我已更改代码示例以捕获选定的值并将其公开给页面,以便您可以在页面的上下文中使用它。
【解决方案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
     }
}

我现在没有时间尝试,但我怀疑应该可以。

【讨论】:

  • 但是是什么让我绑定中继器的事件触发(OptionsItemDataBound)?
  • 另外,我发现我可以找到中继器,但它没有任何控件 - ??
  • 我假设中继器已经有一个与之关联的数据源。这只是添加了一个额外的钩子,因此您可以在需要时执行额外的工作。至于中继器控件,您将找不到任何东西。您需要从 ItemDataBound 事件访问 DropDownList 才能执行与这些控件相关的其他步骤。
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2010-10-07
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多