Some scenarios developers may want to restrict users from deleting webparts from  a page, the scenarios varies.
SPWebPartManager has got a event named ‘OnWebPartDeleting’.The issue here is, the deletion of the webpart cannot be
avoided by setting the WebPartCancelEventArgs.Cancel = true; within the   ‘OnWebPartDeleting’ event.
So the SPWebPartManager’s ‘OnWebPartDeleting’event is not going to help us in accomplishing our requirement, here I have a workaround, it may help you! 

 

 

……….
<script runat="server">
  protected void On_WebPartDeleting(object sender, WebPartCancelEventArgs e)
  {
      Page.Response.Write("Sorry! This webpart cannot be deleted!<br>");  
       e.Cancel = true;    
  }
</script>
  <form >

 
<WebPartPages:SPWebPartManager OnWebPartDeleting="On_WebPartDeleting"  id="m" runat="Server"/>

 

As a workaround your can implement this, not sure you like this approach:)

Develop a custom HttpModule to trace the WebPart delete events,  basically tracing the ‘__EVENTARGUMENT’ value.

See below the implementation.

   1: void application_PostAuthorizeRequest(object sender, EventArgs e)
   2: {
   3: HttpContext context = HttpContext.Current;
   4:  
   5: if (context != null && context.Request.Params["__EVENTARGUMENT"] != null && Convert.ToString(context.Request.Params["__EVENTARGUMENT"]).Length > 1)
   6: {
   7: string contextValue = context.Request.Params["__EVENTARGUMENT"];
   8:  
   9: if (contextValue.Contains("MSOMenu_Delete"))
  10: {
  11: try
  12: {
  13: string[] keyValue = contextValue.Split(new char[] { ';' });
  14: Guid guid = new Guid(keyValue[0]);
  15: SPWeb web = SPContext.Current.Web;
  16: SPLimitedWebPartManager manager = web.GetLimitedWebPartManager(context.Request.RawUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
  17: System.Web.UI.WebControls.WebParts.WebPart webpart = manager.WebParts[guid];
  18: context.Response.Write("<h5><font color=red>Sorry, you do not have the rights to delete this webpart. Please contact your admin.</font></h5><br><a href=" + context.Request.RawUrl+ ">Back</a>");
  19:  
  20: context.Response.Flush(); 
  21: context.Response.End();
  22: }
  23: catch (Exception ex)
  24: {
  25: }
  26: }
  27: }

 

This is a tricky workaround, however if you are looking for options to achieve this functionality then this would help.

Enjoy!