如何从用户控件调用方法到aspx页面?

3
我希望能够从用户控件中调用一个方法到aspx页面。
我正在尝试,但是我无法在aspx页面中调用该方法。
代码:

AddVisaUserControl.ascx.cs

public event EventHandler UserControlButtonClicked;

    public void OnUserControlButtonClick()
    {
        if (UserControlButtonClicked != null)
        {
            UserControlButtonClicked(this,EventArgs.Empty);
        }
    }

protected void btnRemove_Click(object sender, EventArgs e)
    {
        OnUserControlButtonClick();
    }

.aspx

编辑

在下面的代码中,当页面加载时,我会收到“空引用错误”

AddVisaControl av; 
protected void Page_Load(object sender, EventArgs e)
    {
        av.UserControlButtonClicked  += new
                EventHandler(AddVisaUserControl_UserControlButtonClicked);
    } 

  private void AddVisaControl_UserControlButtonClicked(object sender, EventArgs e)
    {
        var ctrl = (AddVisaControl)LoadControl(@"AddVisaControl.ascx");
        //ctrl.ID = i;
        this.rpt1.Controls.Remove(ctrl);
    }

任何想法?提前感谢。

看起来没问题,只是没有触发吗?AddVisaUserControl_UserControlButtonClicked的头是什么? - stevepkr84
你是否已经将控件添加到aspx文件中了?你不能只是这样声明它。首先,它不会被初始化,因此会出现空引用。 - stevepkr84
4个回答

1
您似乎有一个未初始化的字段:

AddVisaControl av; 

默认值为null,因此会出现NullReferenceException异常。

如果您已将UserControl的实例添加到aspx页面中,则应该有一个名称等于UserControl实例ID的实例:

=== 在Page.aspx中

<uc1:AddVisaUserControl ID="MyControl" ... />

在 Page.aspx.cs 文件中。
MyControl.UserControlButtonClicked += ...

谢谢您的回复,那么如何调用该事件(UserButtonClicked)? - user2500094

1

你的 ascx 控件

public delegate void ButtonClickEventHandler(string data);
public event ButtonClickEventHandler ButtonClickEvent = null;

if (ButtonClickEvent != null)
            ButtonClickEvent("Send to aspx");

你的aspx页面:
<%@ Register TagPrefix="uc" TagName="uc1" 
             Src="~/Controls/AddVisaUserControl.ascx" %>
<uc:AddVisaControl id="uc1" runat="server" />


 protected void Page_Load(object sender, EventArgs e)
    {
        uc1.ButtonClickEvent += new yourusercontrol.ButtonClickEventHandler(Login1_ButtonClickEvent);
    }

    void uc1_ButtonClickEvent(string data)
    {
        lbldefaultaspx.Text = data.ToString();
    }

0

Usercontrol.ascx

Me.Page.GetType.InvokeMember("ClosePopUp", System.Reflection.BindingFlags.InvokeMethod, Nothing, Me.Page, New Object() {parameter1,parameter2})

ParentPage.aspx

Public Sub ClosePopUp(parameter1,parameter2)
/*Your Logic Here
End Sub

0

你已经通过+= new语法创建了委托,但是在你的页面代码中没有实际被调用的方法。

换句话说,你需要在你的.aspx页面代码中添加一个AddVisaUserControl_UserControlButtonClicked方法,就像这样:

protected void AddVisaUserControl_UserControlButtonClicked(object sender, 
                                                           EventArgs e)
{
    // Logic here for what the page does when the user control's remove 
    // button is clicked

}

更新:

随着原始帖子发布更多的代码,看起来用户控件是一个空引用,因为这一行代码:

AddVisaControl av;

这不会实例化用户控件,因此您可以做两件事:

  1. 实例化用户控件,如下所示:

    AddVisaControl av = new AddVisaControl();
    

    调用委托,如下所示:

    av.UserControlButtonClicked  += new
            EventHandler(AddVisaUserControl_UserControlButtonClicked);
    
  2. 将用户控件添加到页面标记中,如下所示:

    <%@ Register TagPrefix="uc" TagName="AddVisaControl" 
                 Src="~/Controls/AddVisaUserControl.ascx" %>
    <uc:AddVisaControl id="AddVisaControl1" runat="server" />
    

    调用委托,如下所示:

    AddVisaControl1.UserControlButtonClicked  += new
            EventHandler(AddVisaUserControl_UserControlButtonClicked);
    

以上的选项(实例化用户控件)并没有太多意义:除非将其添加到控件树中,否则实例化用户控件是毫无意义的。 - Joe
@Joe - 我同意,只是在技术上说,这将缓解空引用问题。 - Karl Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接