Вызов метода в родительском элементе из пользовательского элемента управления

По некоторым причинам, связанным с бизнесом, я создал мастер навигации пользователя. Довольно просто: кнопки Next/Previous/Finish.

Каждая из родительских страниц, которые используют этот пользовательский элемент управления nav, имеет функцию SaveData, которая сохраняет данные и выполняет множество других действий.

Когда пользователь нажимает кнопку Далее / Предыдущий / Готово, я хочу вызвать функцию SaveData родительского элемента перед перенаправлением на другую страницу. Как мне это сделать или вы можете порекомендовать лучший способ (примеры кода, если это возможно, пожалуйста)?

Заранее спасибо!

1 ответ

UserControl не должен вызывать функцию Parent. Это не хороший дизайн.

Вместо этого вы хотите поместить событие из UserControl в родительскую страницу.

Примечание: пространство имен моего проекта - 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);
        }
    }
}

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

Parent.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";
    }
}

Вам нужен только делегат:

public delegate void ClickEventHandler(object sender, EventArgs e);
public event ClickEventHandler NextClicked; 
Другие вопросы по тегам