Programmatically create asp:Button and attach event in SharePoint - c#

I'm trying to create ASP.NET buttons programmatically inside an update panel in my SharePoint instance, but because of the page life cycle, I can not attach server side events on buttons.
Here is the code:
TableCell tcellbutton = new TableCell();
b.Click += new EventHandler(b_Click);
b.CausesValidation = true;
tcellbutton.Controls.Add(b);
tr.Cells.Add(tcellbutton);
table.Rows.Add(tr);
panel1.Controls.Add(table);
void b_Click(object sender, EventArgs e)
{
string studentnumber = (sender as Button).ID.ToString().Substring(3, (sender as Button).ID.ToString().Length - 3);
TextBox t = panel1.FindControl("txt" + studentNumber) as TextBox;
}
Is there another way to create and attach buttons in Sharepoint?

Ok here is how I solved it, Thanks for all replies, I was looking for a way to attach an event to a button that is created dynamically during runtime (after initialization). Hope It works for others as well.
<script type="text/javascript">
function ButtonClick(buttonId) {
alert("Button " + buttonId + " clicked from javascript");
}
</script>
protected void Button_Click(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptBlock(this.GetType(), ((Button)sender).ID, "<script>alert('Button_Click');</script>");
Response.Write(DateTime.Now.ToString() + ": " + ((Button)sender).ID + " was clicked");
}
private Button GetButton(string id, string name)
{
Button b = new Button();
b.Text = name;
b.ID = id;
b.Click += new EventHandler(Button_Click);
b.OnClientClick = "ButtonClick('" + b.ClientID + "')";
return b;
}

You should add your code in PreInit event, code below work good:
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
Button bb = new Button();
bb.Click += new EventHandler(bb_Click);
bb.CausesValidation = true;
bb.ID = "button1";
Panel1.Controls.Add(bb);
}
private void bb_Click(object sender, EventArgs e)
{
Response.Write("any thing here");
}

You are creating dynamic controls. Your code should execute in each PageLoad event.
Remove IsPostBack for the part of code where you are creating the buttons is my advice.
If you don't do this, you will create the controls, but each time when PageLoad event occurs, your control will be deleted and the application will not follow your events. With other words you should always recreate the controls.

Related

Setting an event handler on a linkbutton inside a class Appointment Template won't fire

I have a telerik RadScheduler control which I am creating a custom appointment template for. The template binds succesfully, however sat inside my template is a linkbutton which I want to bind an event to. I can see that the event binds, however it does not call the code and hit the response.redirect, instead the page refreshes and the appointment templates dissapear. How do I get the event to handle correctly on the button click? The apptemplate is being appended on the page load.
public class AppTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
SchedulerAppointmentContainer aptCont = (SchedulerAppointmentContainer)container;
Appointment app = aptCont.Appointment;
LinkButton lbs = new LinkButton();
lbs.ID = "btnConductAppointment";
lbs.Text = "<div style=\"font-weight:bold;\">" + app.Attributes["ApptClientID"] + "</div><div>" + app.Attributes["Title"] + " " + app.Attributes["Surname"] + "</div>";
//nlbs.Click += btnConductAppointment_Click;
lbs.DataBinding += new EventHandler(label1_DataBinding);
lbs.CausesValidation = false;
container.Controls.Add(lbs);
}
private void label1_DataBinding(object sender, EventArgs e)
{
LinkButton target = (LinkButton)sender;
target.Click += new EventHandler(btnConductAppointment_Click);
}
protected void btnConductAppointment_Click(object sender, EventArgs e)
{
HttpContext.Current.Response.Redirect(PageDirectory.Default, true);
}
}
Putting the bind in on the PageInit Means the event always exists.
protected override void OnInit(EventArgs e)
{
RadScheduler1.AppointmentTemplate = new AppTemplate();
}

The LinkButton_Click event is not firing

I have created a dynamic link button. I want to navigate to other pages when the click event is fired . But now, when I click on the link button, the entire page is cleared off and no click event is fired.
System.Web.UI.WebControls.LinkButton lbView = new System.Web.UI.WebControls.LinkButton();
lbView.Text = "<br />" + "View";
lbView.Click += new System.EventHandler(lbView_Click);
tc.Controls.Add(lbView);
tr.Cells.Add(tc);
protected void lbView_Click(object sender, EventArgs e)
{
Response.Redirect("contactus.aspx");
}
Please help.
When you are creating dynamic control you can not directly create click event of that control. In your case you must follow this way. Add javascript to redirect contactus.aspx page.
System.Web.UI.WebControls.LinkButton lbView = new System.Web.UI.WebControls.LinkButton();
lbView.Text = "<br />" + "View";
btn.OnClientClick = "return RedirectTo();"; // You need to add javascript event
tc.Controls.Add(lbView);
tr.Cells.Add(tc);
// javascript
<script>
function RedirectTo()
{
window.location.href = 'contactus.aspx';
return false;
}
</script>
Try this. Hope it works for you.
Put your code inside like this and try :-
if(!IsPostBack){
System.Web.UI.WebControls.LinkButton lbView = new System.Web.UI.WebControls.LinkButton();
lbView.Text = "<br />" + "View";
lbView.Click += new System.EventHandler(lbView_Click);
tc.Controls.Add(lbView);
tr.Cells.Add(tc);
}
protected void lbView_Click(object sender, EventArgs e)
{
Response.Redirect("contactus.aspx");
}

add a button click event dynamically in asp.net 4.5 c#

I have some questions to this post [1]: How can i create dynamic button click event on dynamic button?
The solution is not working for me, I created dynamically an Button, which is inside in an asp:table controller.
I have try to save my dynamic elements in an Session, and allocate the Session value to the object in the Page_Load, but this is not working.
Some ideas
edit:
...
Button button = new Button();
button.ID = "BtnTag";
button.Text = "Tag generieren";
button.Click += button_TagGenerieren;
tabellenZelle.Controls.Add(button);
Session["table"] = table;
}
public void button_TagGenerieren(object sender, EventArgs e)
{
TableRowCollection tabellenZeilen = qvTabelle.Rows;
for (int i = 0; i < tabellenZeilen.Count; i++)
{
...
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Session["table"] != null)
{
table = (Table) Session["table"];
Session["table"] = null;
}
}
}
It is not a good practice to store every control into Session state.
Only problem I found is you need to reload the controls with same Id, when the page is posted back to server. Otherwise, those controls will be null.
<asp:PlaceHolder runat="server" ID="PlaceHolder1" />
<asp:Label runat="server" ID="Label1"/>
protected void Page_Load(object sender, EventArgs e)
{
LoadControls();
}
private void LoadControls()
{
var button = new Button {ID = "BtnTag", Text = "Tag generieren"};
button.Click += button_Click;
PlaceHolder1.Controls.Add(button);
}
private void button_Click(object sender, EventArgs e)
{
Label1.Text = "BtnTag button is clicked";
}
Note: If you do not know the button's id (which is generated dynamically at run time), you want to save those ids in ViewState like this - https://stackoverflow.com/a/14449305/296861
The problem lies in the moment at which te button and it's event are created in the pagelifecycle. Try the page_init event for this.
Create Button in page load
Button btn = new Button();
btn.Text = "Dynamic";
btn.Click += new EventHandler(btnClick);
PlaceHolder1.Controls.Add(btn)
Button Click Event
protected void btnClick(object sender, EventArgs e)
{
// Coding to click event
}

Event does not fired when i create a button programatically

I was create a button dynamically with event handler. But the event not fired. Please help me to do this. My partial code is here.
Button btn = new Button();
btn.ID = "btn" + i;
btn.Text = "Add New";
Panel1.Controls.Add(btn);
btn.Click += new EventHandler(this.GreetingBtn_Click);
Panel1.Controls.Add(new LiteralControl("<br /><br />"));
void GreetingBtn_Click(Object sender, EventArgs e)
{
create();
}
I want to access the create() function when i click the button.
Without knowing much about your code, I'm guessing you're not creating the control in the appopriate stage of the page life cycle of ASP.NET
what you need is PreInit, as described here:
Raised after the start stage is complete and before the initialization stage begins.
Use this event for the following:
Create or re-create dynamic controls.
if you are adding this dynamic button on page load, make sure its under
if (!IsPostBack)
{
//add button here
}
always make your code of creating one time control that will made should be in side !ispostback because they are not need to be created again and again
if (!IsPostBack)
{
//Your code should be their enter code here
}
List<string> myControls = new List<string>();
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
myControls = new List<string>();
ViewState["myControls"] = myControls;
}
}
protected void override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
myControls = (List<string>)ViewState["myControls"];
foreach(string controlID in myControls){
//method to create your buttons goes here.
createButtons(controlID);
}
}
public void createButtons(string btnID){
Button btn = new Button();
btn.ID = btnID;
btn.Text = "Add New";
btn.Click += new RoutedEventHandler(this.GreetingBtn_Click);
Panel1.Controls.Add(btn);
Panel1.Controls.Add(new LiteralControl("<br /><br />"));
}
void GreetingBtn_Click(Object sender, RoutedEventArgs e){
create();
}
Give this code a try. When adding controls dynamically in asp.net you have to recreate the controls in the postback. The easiest way to do this is using the viewstate as I showed above.
Common signs of not doing this correctly are: control disappears when you click it or event just doesn't fire at all. Hope this helps someone!
Move btn.Click += new EventHandler(this.GreetingBtn_Click); line one level up i.e. before adding to parent And try Routed events.
Button btn = new Button();
btn.ID = "btn" + i;
btn.Text = "Add New";
btn.Click += new RoutedEventHandler(this.GreetingBtn_Click);
Panel1.Controls.Add(btn);
Panel1.Controls.Add(new LiteralControl("<br /><br />"));
void GreetingBtn_Click(Object sender, RoutedEventArgs e)
{
create();
}

Dynamic control and its Event

We are creating dynamic text boxes and buttons inside a grid for each row. Now we want to create click event for each button. To create button inside the grid in using ITemplate.
Code:
ImageButton imbtnAdd = new ImageButton();
imbtnAdd.ID = "imbtn" + columnName;
imbtnAdd.ImageUrl = "btn_add_icon.gif";
imbtnAdd.Width = 20;
container.Controls.Add(imbtnAdd);
Error:
I have used imbtnAdd.Click += new ImageClickEventHandler(imbtnAdd_Click); but it shows an error message
imbtnAdd_Click does not exist
ImageButton imbtnAdd = new ImageButton();
imbtnAdd.ID = "imbtn" + columnName;
imbtnAdd.ImageUrl = "btn_add_icon.gif";
imbtnAdd.Width = 20;
imbtnAdd.Click += imbtnAdd_Click;
container.Controls.Add(imbtnAdd);
// ...
private void imbtnAdd_Click(object sender, EventArgs e)
{
// handle event
}
Jrista's answer is correct.
Although, if you want to implement different handlers for all the buttons and you are using .Net 3.0 or above, you can use lambdas:
imbtnAdd.Click += (object sender, EventArgs e) =>
{
// Code handling code goes here...
};

Categories