0

I'm creating a button on a Sharepoint page dynamically (in C#) in my *.ascx.cs file:

Button btnSave = null;

protected void Page_Load(object sender, EventArgs e)
{
    base.OnPreRender(e);    

    this.Controls.Add(new LiteralControl("<br />"));
    btnSave = new Button();
    btnSave.ID = "btnSave";
    btnSave.Text = "Save the Data"; 
    btnSave.Click += new EventHandler(btnSave_Click);
    btnSave.Visible = false;
    this.Controls.Add(btnSave);
}

protected void btnSave_Click(object sender, EventArgs e)
{
    btnSave.Text = "You clicked me!"; 
    PostTravelData ptd = new PostTravelData();
}

I set it visible at the right time in the client-side jQuery in the *.ascx file:

$('#btnSave').show();

However, clicking the button does not reach the btnSave_Click() event - the breakpoint there is never reached, nor is the button's text changed. Why not?

Even when I don't set the button invisible (comment out the "btnSave.Visible = false;" line), the click handler isn't reached...is Page_Load() too late? Is there an earlier page event I can use that would work?

I tried moving it from Page_Load() to OnPreRender(), too, like this:

protected void OnPreRender(EventArgs e)
{
    this.Controls.Add(new LiteralControl("<br />"));
    btnSave = new Button();
    btnSave.ID = "btnSave";
    btnSave.Text = "Save the Data";
    btnSave.Click += new EventHandler(btnSave_Click);
    //btnSave.Visible = false;
    this.Controls.Add(btnSave);
}

...(and OnRender()) but the button doesn't even display...

And, trying a different tack, I commented out the dynamic creation server-side code and tried to attach to a button created in the HTML (*.ascx file):

<button type="button" name="saveData" id="saveData" runat="server" onclick="saveData_Click">Save Data</button>

(by adding the "runat server" and the onclick handler), and then adding this "code-behind" (*.ascx.cs)):

protected void saveData_Click(object sender, EventArgs e)
{
    PostTravelData ptd = new PostTravelData();
    SaveToList(ptd);
    GeneratePDF(ptd);
}        

...but there was still no joy in Mudville -- the breakpoint in the handler is not reached.

Yet another attempt was:

In the *.ascx:

<asp:Button runat="server" id="saveData" name="saveData" onclick="saveData_Click" Text="Bla" />

In the code-behind:

saveData.Click += saveData_Click;

The "Bla" button is created, but clicking on it reaches not the breakpoint in the "saveData_Click" handler.

I even adapted some code from here like so:

Button btnSave = null;

. . .

protected override void CreateChildControls()
{
    btnSave = new Button();
    btnSave.Width = new Unit(150, UnitType.Pixel);
    btnSave.Text = "Can you see me?";
    btnSave.Click += new EventHandler(btnSave_Click);
    Controls.Add(btnSave);
}

...but I still do not reach the "protected void btnSave_Click(object sender, EventArgs e)" handler when I click the button.

Surely there's a way to get a handle on the button server-side and manipulate it (specifically, respond to its click event)...?!?

1

For it to work (for the event to fire), the button has to be an HtmlButton (not a generic (submit) Button), and the ServerClick event needs to be assigned, (not the plain old Click event). This works:

protected void Page_Load(object sender, EventArgs e)
{
    base.OnPreRender(e);

    btnSave = new HtmlButton();
    btnSave.ID = "btnSave";
    btnSave.InnerHtml = "Save";
    btnSave.ServerClick += new EventHandler(btnSave_Click);
    this.Controls.Add(btnSave);
}

protected void btnSave_Click(object sender, EventArgs e)
{
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.