使用单个事件处理程序 asp.net 从网格中处理多个删除事件

Posted

技术标签:

【中文标题】使用单个事件处理程序 asp.net 从网格中处理多个删除事件【英文标题】:Handle multiple delete events from grid with single events handlers asp.net 【发布时间】:2016-05-23 06:04:21 【问题描述】:

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

<telerik:RadAjaxManager ID="RadAjaxManager2" runat="server" meta:resourcekey="RadAjaxManager1Resource1" OnAjaxRequest="RadAjaxManager2_AjaxRequest">
                <AjaxSettings>
                    <telerik:AjaxSetting AjaxControlID="RadAjaxManager2">
                        <UpdatedControls>
                            <telerik:AjaxUpdatedControl ControlID="Grid1" />
                            <telerik:AjaxUpdatedControl ControlID="Grid2" />
                        </UpdatedControls>
                    </telerik:AjaxSetting>
                </AjaxSettings>
            </telerik:RadAjaxManager>

 <telerik:RadGrid ID="Grid1" runat="server">
  ---
  ---
  <telerik:GridTemplateColumn HeaderText="Action" UniqueName="Action" HeaderStyle-Width="130px">
                                        <ItemTemplate>
                                     <asp:ImageButton runat="server" ID="Remove1" Text="Delete" OnClientClick='<%# Eval("Id", "javascript:return DeleteData(\"0\");") %>' />
                                        </ItemTemplate>
                                    </telerik:GridTemplateColumn>

 <telerik:RadGrid ID="Grid2" runat="server">
  ---
  ---
  <telerik:GridTemplateColumn HeaderText="Action" UniqueName="Action" >
                                        <ItemTemplate>
                                     <asp:ImageButton runat="server" ID="Remove2" Text="Delete" OnClientClick='<%# Eval("Id", "javascript:return DeleteData(\"0\");") %>' />
                                        </ItemTemplate>
                                    </telerik:GridTemplateColumn>



 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 按钮时调用单个删除事件。

【问题讨论】:

【参考方案1】:

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

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

    OnClientClick='<%# Eval("Id", "DeleteData('0', 'Remove1'); return false;") %>'   
    
    OnClientClick='<%# Eval("Id", "DeleteData('0', 'Remove2'); return false;") %>'
    

    更改 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.
    
    

    在后面的代码中,包含一个 RemoveRecord 方法,并且不需要像在原始代码中那样创建事件处理程序。因此,您应该从原始代码中删除以下方法:Remove1_ClickRemove2_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


    
 

【讨论】:

实际上我有一个页面是 ParentPage.cs,这个 Onajaxrequest 在 ParentPage.cs 页面上。这个 Grid 和我的 Remove1 和 Remove2 方法驻留在 Abc.aspx 上,我继承了这个 abx.cs 页面来自 parentPage:public 部分类 Abc: ParentPage 那么如何从 ParentPage.cs 页面调用这个 RemoveRecord? 将 C# 代码放在父页面中,因为方法 RadAjaxManager2_AjaxRequest 在父页面中。网格可以在子页面上。 是的。这两种方法都应该在父页面中 - RemoveRecordRadAjaxManager2_AjaxRequest 但是如果你把RadAjaxManager2_AjaxRequest转移到子页面然后把所有的C#代码放在子页面中。【参考方案2】:

您只需使用 RadGrid_ItemCommand 并使用 del 按钮传递命令参数并更改两者的命令名称即可删除她的示例代码

<telerik:GridTemplateColumn HeaderText="Actions">
                                        <ItemTemplate>
                                            <asp:ImageButton ID="Button3" Style="width: 14px" Height="14px" ImageUrl="~/Images/Erase.png" runat="server" Text="Delete1" OnClientClick="return confirm('Are you sure you want to delete this item?');" CommandName="Delete1" CommandArgument='<%# Eval("Pid") %>' />
                                            &nbsp &nbsp
 <asp:ImageButton ID="Button3" Style="width: 14px" Height="14px" ImageUrl="~/Images/Erase.png" runat="server" Text="Delete2" OnClientClick="return confirm('Are you sure you want to delete this item?');" CommandName="Delete2" CommandArgument='<%# Eval("Pid") %>' />

                                        </ItemTemplate>
                                    </telerik:GridTemplateColumn>



    protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)

    if (e.CommandName == "Delete1")
    

    
if (e.CommandName == "Delete2")
    

    


【讨论】:

抱歉,我只能将现有代码与 radajaxmanager 一起使用。所以你能按照这个给出解决方案吗

以上是关于使用单个事件处理程序 asp.net 从网格中处理多个删除事件的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET:如何在订阅的事件处理程序中更新前端

Telerik Kendo UI ASP.NET MVC Grid - 已保存数据项的事件处理

ASP.NET 事件处理

关于asp.net中页面事件加载的先后顺序

ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常

ASP.net 应用程序未在使用 WCF 服务的网格视图控件中显示总计