【问题标题】:Calling method in parent from user control从用户控件调用父级中的方法
【发布时间】:2014-11-13 07:09:24
【问题描述】:

出于一些与业务相关的原因,我制作了一个向导导航用户控件。很简单:下一个/上一个/完成按钮。

使用此导航用户控件的每个父页面都有一个 SaveData 函数,该函数可以保存数据并执行许多其他操作。

当用户单击 Next/Previous/Finish 时,我想在重定向到其他页面之前调用父级的 SaveData 函数。我应该怎么做或者你能推荐一个更好的方法(如果可能的话,请提供代码示例)?

提前致谢!

【问题讨论】:

  • 最好不要直接调用它,那样会使用户控件不可移植。相反,在页面可以订阅的控件上有一个事件。例如,您的控件有一个OnSave 事件,因此当您在页面上声明该控件时,您可能会执行类似<uc:MyControl runat="server" OnSave="SaveData" /> 的操作

标签: asp.net vb.net user-controls


【解决方案1】:

你只需要委托:

public delegate void ClickEventHandler(object sender, EventArgs e);
public event ClickEventHandler NextClicked; 

【讨论】:

    【解决方案2】:

    UserControl 不应调用 Parent 的函数。这不是一个好的设计。

    相反,您希望将事件从 UserControl 冒泡到 Parent 页面。

    注意:我的项目的命名空间是DemoWebForm

    MyUserControl.ascx

    <%@ Control Language="C#" AutoEventWireup="true" 
        CodeBehind="MyUserControl.ascx.cs" 
        Inherits="DemoWebForm.MyUserControl" %>
    
    <asp:Button runat="server" ID="NextButton" 
        OnClick="NextButton_Click" Text="Next" />
    
    <asp:Button runat="server" ID="PreviousButton" 
        OnClick="PreviousButtonn_Click" Text="Previous" />
    
    <asp:Button runat="server" ID="FinishButton" 
        OnClick="FinishButton_Click" Text="Finish" />
    

    MyUserControl.ascx.cs

    public partial class MyUserControl : System.Web.UI.UserControl
    {
        public event ClickEventHandler NextClicked;
        public event ClickEventHandler PreviousClicked;
        public event ClickEventHandler FinishClicked;
    
        protected void NextButton_Click(object sender, EventArgs e)
        {
            if (NextClicked != null)
            {
                NextClicked(sender, e);
            }
        }
    
        protected void PreviousButtonn_Click(object sender, EventArgs e)
        {
            if (PreviousClicked != null)
            {
                PreviousClicked(sender, e);
            }
        }
    
        protected void FinishButton_Click(object sender, EventArgs e)
        {
            if (FinishClicked != null)
            {
                FinishClicked(sender, e);
            }
        }
    }
    

    父.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Parent.aspx.cs" 
        Inherits="DemoWebForm.Parent" %>
    
    <%@ Register Src="MyUserControl.ascx" TagName="MyUserControl" TagPrefix="uc1" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <uc1:MyUserControl ID="MyUserControl1" runat="server"
                OnNextClicked="MyUserControl1_NextClicked"
                OnPreviousClicked="MyUserControl1_PreviousClicked"
                OnFinishClicked="MyUserControl1_FinishClicked" />
            <asp:Literal runat="server" ID="MessageLiteral" />
        </form>
    </body>
    </html>
    

    父.aspx.cs

    public partial class Parent : System.Web.UI.Page
    {
        protected void MyUserControl1_NextClicked(object sender,EventArgs e)
        {
            MessageLiteral.Text = "Next button was clicked";
        }
    
        protected void MyUserControl1_PreviousClicked(object sender, EventArgs e)
        {
            MessageLiteral.Text = "Previous button was clicked";
        }
    
        protected void MyUserControl1_FinishClicked(object sender, EventArgs e)
        {
            MessageLiteral.Text = "Finish button was clicked";
        }
    }
    

    【讨论】:

    • +1 很好的例子!但是这个问题在 VB.NET 中被标记了。如果您了解 VB,也许您可​​以将其转换为使用 VB?我会为你做,但我只会看VB,我不会写。
    • 您可以使用Telerik Convert Code。抱歉,我已经好几年没写VB了。
    • 在 Parent.aspx 中 OnNextClicked 应该是 NextClicked 吗? (其他相同)
    • 我尝试使用您的示例,对于 ClickEventHandler,我收到“找不到类型或命名空间 'ClickEventHandler',您是否缺少 using 指令...”。 ClickEventHandler 的 using 指令是什么?
    • @DovMiller 能否请您创建一个新问题,并在此处发布链接?我很乐意看看它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多