使用单个事件处理程序asp.net处理来自网格的多个删除事件

我有两个网格,其中包含删除按钮,我正在使用RadAjaxManager,它将从客户端发送ajax请求到服务器端OnajaxRequest,其中包含事件处理程序,该事件处理程序将调用我的删除事件,如下所示:

           --- ---   <asp:ImageButton runat="server" ID="Remove1" Text="Delete" OnClientClick='' />    --- ---   <asp:ImageButton runat="server" ID="Remove2" Text="Delete" OnClientClick='' />   function DeleteData(Id) { var ajaxManager = null; var action = 'Remove'; ajaxManager = $find("ctl00_cphMain_RadAjaxManager2"); var arg = action + "," + Id; //Remove,1(1 indicates id of record to remove from grid) ajaxManager.ajaxRequest(arg);This line will fire below method. } public event EventHandler RemoveEvent; protected void RadAjaxManager2_AjaxRequest(object sender, AjaxRequestEventArgs e) { var argument = (e.Argument); var stringArray = argument.Split(",".ToCharArray());//[0]="Remove",[1]=1 if (stringArray[0] == "Remove") { RemoveEvent(stringArray[1], null); } } 

在此之后它将调用此:

 protected void Page_Load(object sender, EventArgs e) { this.RemoveEvent += Remove1_Click; this.RemoveEvent += Remove2_Click; if (!IsPostBack) { } } protected void Remove1_Click(object sender, object obj) { } protected void Remove2_Click(object sender, object obj) { } 

这里的问题是这个事件都在调用,但我只想在单击Remove1和Remove2按钮时调用单个删除事件。

任何人都可以帮我吗?

您不需要在代码隐藏中订阅事件,即不需要this.RemoveEvent+= 。 而是编写一个名为RemoveRecord(buttonId, recordId)方法RemoveRecord(buttonId, recordId) 。 我已经按照下面的分步方式解释了这种方法。

  1. 首先更改OnClientClick的标记。 请注意,我们将传递要删除的记录的Id以及被单击到JavaScript函数DeleteData的按钮的服务器端ID。

     OnClientClick='<%# Eval("Id", "DeleteData('{0}', 'Remove1'); return false;") %>' OnClientClick='<%# Eval("Id", "DeleteData('{0}', 'Remove2'); return false;") %>' 
  2. 更改JavaScript Delete方法。 请注意,我们现在传递服务器端按钮ID,因此在代码隐藏中我们可以轻松地知道单击了哪个按钮。

     function DeleteData(Id, buttonId) { var ajaxManager = null; ajaxManager = $find("<%=RadAjaxManager2.ClientID%>"); var arg = buttonId + "," + Id; //Remove1,1 (1 indicates id of record to remove from grid) ajaxManager.ajaxRequest(arg);//This line will fire below method. } 
  3. 在后面的代码中,包含一个RemoveRecord方法,并且不需要像在原始代码中那样创建事件处理程序。 因此,您应该从原始代码中删除以下方法: Remove1_ClickRemove2_Click ,并删除订阅Click事件的Page_Load中的代码。

     protected void RadAjaxManager2_AjaxRequest(object sender, AjaxRequestEventArgs e) { var stringArray = e.Argument.Split(",".ToCharArray());//[0]="Remove1" or "Remove2",[1]=id of record to delete RemoveRecord( stringArray[0], stringArray[1]); } //the method below will delete data private void RemoveRecord( buttonId, recordId) { if(buttonId== "Remove1") { //code to delete record with id of recordId } else if ( buttonId == "Remove2") { //code to delete record with id of recordId } } 

另一种方法

如果您必须在父页面中使用RadAjaxManager2_AjaxRequest并删除子页面中的方法,请在标题中提到的适当位置添加以下代码。 但请注意,上述方法中提到的标记更改和JavaScript函数更改也适用于此方法。

在父页面(在课堂外)

 public class RemoveEventArgs : EventArgs { public RemoveEventArgs ( string buttonId, string recordId) { this.ButtonId = buttonId; this.RecordId = recordId; } public string ButtonId {get;set;} public string RecordId {get;set;} } 

此外,在同一父页面中,将方法RadAjaxManager2_AjaxRequest更改为下面给出的内容。

在父页面中(更改此现有方法)

  protected void RadAjaxManager2_AjaxRequest(object sender, AjaxRequestEventArgs e) { var stringArray = e.Argument.Split(",".ToCharArray());//[0]="Remove1",[1]=1 OR [0]="Remove2", [1] = 212 if (stringArray[0] == "Remove1" || stringArray[0] == "Remove2") { if(RemoveEvent!=null) { RemoveEvent(this, new RemoveEventArgs(stringArray[0], stringArray[1])); } } } 

在子页面中(更改现有方法)

 protected void Remove1_Click(object sender, RemoveEventArgs obj) { if( obj!=null && obj.ButtonId == "Remove1") { string recordId = obj.RecordId; //write your code for deleting } } protected void Remove2_Click(object sender, RemoveEventArgs obj) { if( obj!=null && obj.ButtonId == "Remove2") { string recordId = obj.RecordId; //write your code for deleting } } 

你只需使用RadGrid_ItemCommand并使用del按钮传递命令参数并更改命令名称以删除她的示例代码

    &nbsp &nbsp    protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e) { if (e.CommandName == "Delete1") { } if (e.CommandName == "Delete2") { } }