【问题标题】:Help needed on nested web User Control event in ASP.NETASP.NET 中的嵌套 Web 用户控件事件需要帮助
【发布时间】:2009-04-05 10:15:41
【问题描述】:

场景:我的 asp 网页中有一个嵌套的 Web 用户控件,并且子用户控件中有一个按钮。

网页:引用一个名为“slot”的父控件,它可以动态加载

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Home.aspx.cs" 
 Inherits="light.Home" %>

<%@ Reference Control="~/UserControl/Slot.ascx" %>

父用户控件:引用一个名为“ray”的子控件,它也可以动态加载

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Slot.ascx.cs"    
 Inherits="light.Slot" %>

<%@ Reference Control="~/UserControl/Ray.ascx" %>

儿童用户控件:有一个名为“ButtonRay”的按钮,我希望它在点击事件时运行。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Ray.ascx.cs" 
 Inherits="light.Ray" %>

<div id="AddRay" runat="server">

<asp:Button ID="ButtonRay" runat="server" Text="Ray" 
onclick="ButtonRay_Click"/>


</div>

问题:按钮未从服务器端触发其点击事件 (ButtonRay_Click)

protected void ButtonComment_Click(object sender, EventArgs e)
{
    // this the code that i want to be executed
}

【问题讨论】:

    标签: asp.net user-controls


    【解决方案1】:

    也许只有我一个人,但我从未见过这样引用和加载控件。这是我会尝试以这种方式做的事情(这对我有用):

    在您的主页中,像这样注册您的 Slot 控件,而不是像以前那样引用它:

    <%@ Register TagName="Slot" TagPrefix="cc" Src="~/Slot.ascx" %>
    

    然后将控件添加到您的页面:

    <cc:Slot ID="SlotControl" runat="server" />
    

    现在在 Slot.ascx 中,注册并包含 Ray 控件:

    <%@ Register TagName="Ray" TagPrefix="cc" Src="~/Ray.ascx" %>
    
    <cc:Ray ID="RayControl" runat="server" />
    

    现在在你的 Ray 控件中,添加你的按钮:

    <asp:Button ID="ButtonRay" Text="Ray" OnClick="ButtonRay_OnClick" runat="server" />
    

    在 Ray.ascx.cs 代码隐藏中,添加您的事件处理程序:

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

    当我在此方法上添加断点、运行应用程序并单击按钮时,OnClick 事件将按应有的方式捕获。我认为正在发生的事情是仅仅引用您的控件并不会连接事件。如果您要动态加载控件,则必须使用 Page.LoadControl() 才能正确连接。

    如果您需要更多解释,请告诉我。

    编辑:

    我刚刚注意到您的按钮单击方法名称与您要求它调用的方法名称不同:您有 ButtonRay 按钮执行 ButtonRay_Click,但您的方法名称是 ButtonComment_Click。

    【讨论】:

    • 注册用户控件时,您只能在网页中看到该控件的单个实例。但是,如果您使用引用声明,您可以拥有任意数量的实例(slot = (Slot)LoadControl("~/UserControl/Slot.ascx"))。这就是我使用参考文献的原因。谢谢
    • 如果您使用 LoadControl,您甚至不需要引用它。而且我可以注册一个控件并根据需要多次使用它(例如自定义按钮或超链接控件)。如果你不能这样做,那将毫无用处。
    【解决方案2】:

    在aspx Page.ie: Home.aspx.cs

    覆盖受保护的 void OnInit(EventArgs e)

    {
        InitializeComponent();
        base.OnInit(e);
    }
    

    私有按钮GetButton()

    {
    
    
        Button Btn = (Button)SlotControl.FindControl("RayControl").FindControl("ButtonRay");
        return Btn;
    }
    
    
    
    private void InitializeComponent()
    {
    
    
        /*   For button Event Initialization */
    
        Button Btnclk = GetButton();
    
        Btnclk.Click += new EventHandler(Btnclk_TextChanged);
    
    }
    

    void Btnclk_TextChanged(object sender, EventArgs e)

    {
    

    /* 在这里写你的代码......*/

     }
    

    【讨论】:

      【解决方案3】:

      在 aspx 页面中。

      覆盖受保护的 void OnInit(EventArgs e) { 初始化组件(); base.OnInit(e); } 私有按钮 GetButton() { 按钮 Btn = (Button)SlotControl.FindControl("RayControl").FindControl("ButtonRay"); 返回 Btn; } 私人无效初始化组件() { /* 用于按钮事件初始化 */

          Button Btnclk = GetButton();
      
          Btnclk.Click += new EventHandler(Btnclk_TextChanged);
      

      } void Btnclk_TextChanged(object sender, EventArgs e)

      {
      

      /* 在这里写你的代码......*/

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        相关资源
        最近更新 更多