如何提升用户控件的单独事件实例?

问题描述:

我有一个用户控件,当文件上传到它的内部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>"; 
} 
在页面上