Search code examples
c#asp.netweb-user-controlsupdatepanel

ASP.NET Update Panel Not Working Inside Web User Control


I have created a html5 canvas and javascript signature pad that I would like to implement as a web user control with an update panel to handle the button clicks. For some reason if I add the update panel and signature pad controls directly into the aspx file the auto postback events work but when I place the same code into a web user control the fields (canvas, buttons, divs, etc) appear but the auto postback no longer works. In both cases I am placing my script manager above the update panel.

Here's my ascx code:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Signature_Pad.ascx.cs"     Inherits="Controls_Signature_Pad" %>

 <asp:UpdatePanel runat="server" ID="signatureUpdate"  updatemode="Conditional">
  <Triggers>
     <asp:AsyncPostBackTrigger controlid="signatureApprove" eventname="Click" />
     <asp:AsyncPostBackTrigger controlid="sigClear" eventname="Click" />
     <asp:AsyncPostBackTrigger controlid="sigCancel" eventname="Click" />
  </Triggers>
  <ContentTemplate>
        <fieldset id="SignatureFieldSet" runat="server" style=" border: 1 solid black;">
       <p><asp:Label ID="signatureTextLabel" AutoPostBack="true"  runat="server" Text=""></asp:Label></p>
        <div id="canvasDiv" style="height: 300px; border:0px solid #000000; ">
            <canvas id="canvasSignature"  style="border:1px solid #000000;"></canvas>
        </div>
        <div id="sigButtonDiv"  style=" border:0px solid #000000;">
            <br /><br />
            <asp:Button AutoPostBack="true" runat="server" OnClick="OnApprove" ID="signatureApprove" Text="Approve" />
            <asp:Button AutoPostBack="true" runat="server" OnClick="OnClear" ID="sigClear" Text="Clear" />
            <asp:Button AutoPostBack="true" runat="server" OnClick="OnCancel" ID="sigCancel" Text="Cancel" />
        </div> 
    </fieldset>
 </ContentTemplate>
</asp:UpdatePanel>

Here's my ascx code behind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Controls_Signature_Pad : System.Web.UI.UserControl
{
private string signatureData;
private string signatureText;

public string SignatureData
{
    get { return signatureData; }
    set { signatureData = value; }
}
public string SignatureText
{
    get { return signatureText; }
    set { signatureText = value; }
}

public void OnApprove(object sender, EventArgs e)
{
    UtilityClass.showMessageBox("Approve Clicked", this);
    SignatureText = "Approved Clicked";
}
public void OnClear(object sender, EventArgs e)
{
    UtilityClass.showMessageBox("Clear Clicked", this);
    SignatureText = "Clear Clicked";
}
public void OnCancel(object sender, EventArgs e)
{
    UtilityClass.showMessageBox("Cancel Clicked", this);
    SignatureText = "Cancel Clicked";
}

public void Page_Load(object sender, EventArgs e)
{
    signatureTextLabel.Text = signatureText;
}
}

Here's my relevant aspx:

...
<%@ Register TagPrefix="mjt" TagName="SignaturePad" Src="~/Controls/Signature_Pad.ascx" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

<asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" EnablePageMethods="true"></asp:ScriptManager>
 <mjt:SignaturePad ID="SignaturePad" runat="server" Visible="true" SignatureData="" SignatureText="Test Signature Test." />

...

Solution

  • Adding event handlers in the code behind fixed the problem. Here's my code:

    The control had three buttons that needed to trigger events (Approve, Clear, and Canceled).

    In ascx.cs:

    public event EventHandler Approved;
    public event EventHandler Cleared;
    public event EventHandler Canceled;
    
     protected void signatureApprove_clicked(object sender, EventArgs e)
    {
    
        if(Approved != null)
        Approved(this, EventArgs.Empty);
    
    }
    protected void sigClear_clicked(object sender, EventArgs e)
    {
            if (Cleared != null)
            Cleared(this, EventArgs.Empty);
    }
    protected void sigCancel_clicked(object sender, EventArgs e)
    {
           if (Canceled != null)
           Canceled(this, EventArgs.Empty);
    }
    

    In ascx:

     <asp:UpdatePanel runat="server" ID="signatureUpdate"  updatemode="Conditional">
      <Triggers>
         <asp:AsyncPostBackTrigger controlid="signatureApprove" eventname="Click" />
         <asp:AsyncPostBackTrigger controlid="sigClear" eventname="Click" />
         <asp:AsyncPostBackTrigger controlid="sigCancel" eventname="Click" />
      </Triggers>
         <ContentTemplate>
           <fieldset id="SignatureFieldSet" class="fieldSetStyle" >
            <p><asp:Label ID="signatureTextLabel" AutoPostBack="true"  runat="server" Text=""></asp:Label></p>
            <div id="canvasDiv" runat="server" >
                <canvas id="canvasSignature" class="canvasStyle"></canvas> 
            </div>
            <div id="sigButtonDiv">
            <br />
                <asp:Button  AutoPostBack="true" runat="server" OnClick="signatureApprove_clicked" ID="signatureApprove" Text="Approve" CssClass="buttonStyle" />
                <asp:Button  AutoPostBack="true" runat="server" OnClick="sigClear_clicked" ID="sigClear" Text="Clear" CssClass="buttonStyle"/>
                <asp:Button  AutoPostBack="true" runat="server" OnClick="sigCancel_clicked" ID="sigCancel" Text="Cancel" CssClass="buttonStyle"/>
            </div> 
          </fieldset>
        </ContentTemplate>
    </asp:UpdatePanel>
    

    In aspx:

    <mjt:SignaturePad OnApproved="Signature_Approved"   OnCanceled="Signature_Canceled" OnCleared="Signature_Cleared" ID="SignaturePad" runat="server"   />
    

    In aspx.cs:

    protected void Signature_Approved(object sender, EventArgs e)
    {
        //Do signature approved action
    }
    protected void Signature_Canceled(object sender, EventArgs e)
    {
        //Do signature cancel action
    }
    protected void Signature_Cleared(object sender, EventArgs e)
    {
       //Do signature cleared action
    }