gpt4 book ai didi

c# - ascx 用户控件中的事件处理

转载 作者:行者123 更新时间:2023-11-30 14:05:26 28 4
gpt4 key购买 nike

将事件从用户控件传递到父控件/页面的最佳做法是什么我想做类似的事情:

MyPage.aspx:
<asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceholder" runat="server">
<uc1:MyUserControl ID="MyUserControl1" runat="server"
OnSomeEvent="MyUserControl_OnSomeEvent" />

MyUserControl.ascx.cs:
public partial class MyUserControl: UserControl
{
public event EventHandler SomeEvent;
....
private void OnSomething()
{
if (SomeEvent!= null)
SomeEvent(this, EventArgs.Empty);
}

问题是什么是最佳实践?

最佳答案

您可能希望在父级订阅的控件上创建一个事件。参见 OdeToCode举个例子。

为了长寿,这里是文章:

一些用户控件是完全独立的,例如,显示当前股票报价的用户控件不需要与页面上的任何其他内容交互。其他用户控件将包含用于回发的按钮。虽然可以从包含页面订阅按钮单击事件,但这样做会破坏一些面向对象的封装规则。更好的想法是在用户控件中发布一个事件,以允许任何感兴趣的各方处理该事件。

这种技术通常被称为“事件冒泡”,因为事件可以继续通过层,从底部(用户控件)开始,可能到达顶层(页面),就像气泡向上移动香槟一样玻璃。

首先,让我们创建一个带有按钮的用户控件。

<%@ Control Language="c#" AutoEventWireup="false" 
Codebehind="WebUserControl1.ascx.cs"
Inherits="aspnet.eventbubble.WebUserControl1"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5"
%>
<asp:Panel id="Panel1" runat="server" Width="128px" Height="96px">
WebUserControl1
<asp:Button id="Button1" Text="Button" runat="server"/>
</asp:Panel>

用户控件背后的代码如下所示。

public class WebUserControl1 : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Panel Panel1;

private void Page_Load(object sender, System.EventArgs e)
{
Response.Write("WebUserControl1 :: Page_Load <BR>");
}

private void Button1_Click(object sender, System.EventArgs e)
{
Response.Write("WebUserControl1 :: Begin Button1_Click <BR>");
OnBubbleClick(e);
Response.Write("WebUserControl1 :: End Button1_Click <BR>");
}

public event EventHandler BubbleClick;

protected void OnBubbleClick(EventArgs e)
{
if(BubbleClick != null)
{
BubbleClick(this, e);
}
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

}

用户控件指定一个声明委托(delegate)的公共(public)事件 (BubbleClick)。任何对 BubbleClick 事件感兴趣的人都可以添加一个 EventHandler 方法以在事件触发时执行 - 就像用户控件为 Button 触发 Click 事件添加一个 EventHandler 一样。

在 OnBubbleClick 事件中,我们首先检查是否有人附加到该事件(BubbleClick != null),然后我们可以通过调用 BubbleClick,传递 EventArgs 参数并设置用户控件来调用所有事件处理方法(this) 作为事件发送者。请注意,我们还使用 Response.Write 来跟踪执行流程。

ASPX 页面现在可以让用户控件工作。

<%@ Register TagPrefix="ksa" 
TagName="BubbleControl"
Src="WebUserControl1.ascx"
%>
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
AutoEventWireup="false" Inherits="aspnet.eventbubble.WebForm1"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<ksa:BubbleControl id="BubbleControl" runat="server" />
</form>
</body>
</HTML>

在页面后面的代码中。

public class WebForm1 : System.Web.UI.Page
{
protected WebUserControl1 BubbleControl;

private void Page_Load(object sender, System.EventArgs e)
{
Response.Write("WebForm1 :: Page_Load <BR>");
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
BubbleControl.BubbleClick += new EventHandler(WebForm1_BubbleClick);
}
#endregion

private void WebForm1_BubbleClick(object sender, EventArgs e)
{
Response.Write("WebForm1 :: WebForm1_BubbleClick from " +
sender.GetType().ToString() + "<BR>");
}
}

注意父页面只需要在 InitializeComponent 方法中添加一个事件处理程序。当我们收到事件时,我们将再次使用 Reponse.Write 来跟踪执行流程。

一个警告:如果事件在任何时候神秘地停止工作,请检查 InitializeComponent 方法以确保设计者没有删除任何添加事件处理程序的代码。

关于c# - ascx 用户控件中的事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/92860/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com