如何提升用户控件的单独事件实例?
问题描述:
我有一个用户控件,当文件上传到它的内部FileUpload控件时引发一个事件。当用户控件只有一个实例将事件注册到页面时,它可以正常工作。当我添加第二个实例时,第一个事件不再起作用。如果我从第一个或第二个实例触发事件,它们最终都会运行UserControl2_FileSelected方法。我想为页面上的每个用户控件运行一个单独的方法。如何提升用户控件的单独事件实例?
页:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyUserControls.Default" %>
<%@ Register Src="~/Classes/Controls/FileUploader.ascx" TagPrefix="uc1" TagName="FileUploader" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<uc1:FileUploader runat="server" id="FileUploader1" Text="Uploader 1" />
<uc1:FileUploader runat="server" ID="FileUploader2" Text="Uploader 2" />
</asp:Content>
代码隐藏页:
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
FileUploader1.FileSelected += new EventHandler(UserControl1_FileSelected);
FileUploader2.FileSelected += new EventHandler(UserControl2_FileSelected);
}
protected void UserControl1_FileSelected(object sender, EventArgs e)
{
//handle event from instance 1
System.Diagnostics.Debug.WriteLine("Control 1");
}
protected void UserControl2_FileSelected(object sender, EventArgs e)
{
//handle event from instance 2
System.Diagnostics.Debug.WriteLine("Control 2");
}
}
用户控件的代码背后:
public partial class FileUploader : System.Web.UI.UserControl
{
public event EventHandler FileSelected;
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (this.FileUpload1.HasFile)
{
this.FileSelected(this, e);
}
}
}
}
答
您需要使用Delegate
,不EventHandler
在用户控制
private Delegate _FileSelected;
public Delegate FileSelected
{
set { _FileSelected = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (FileUpload1.HasFile)
{
//invoke the command in the parent
_FileSelected.DynamicInvoke(FileUpload1.FileName);
}
}
,然后将含有该控制
delegate void FileSelected(string value);
protected void Page_Load(object sender, EventArgs e)
{
//add the delegates to the usercontrol
FileSelected fileSelected1 = new FileSelected(UserControl1_FileSelected);
FileUploader1.FileSelected = fileSelected1;
FileSelected fileSelected2 = new FileSelected(UserControl2_FileSelected);
FileUploader2.FileSelected = fileSelected2;
}
private void UserControl1_FileSelected(string value)
{
Label1.Text += "1: " + value + "<br>";
}
private void UserControl2_FileSelected(string value)
{
Label1.Text += "2: " + value + "<br>";
}
在页面上