Answered by:
Button.Click Event not firing in webpart

Question
-
I cannot get this button to fire. The page posts back, but the button doesnt fire. All I am doing is changing som text, and it still wont work. Any idea?
public class DBConnectWebPart : WebPart { Button visSaveButton = new Button(); protected override void CreateChildControls { base.CreateChildControls();visSaveButton.Click += new EventHandler(saveButton_Click); visSaveButton.Text = "Save"; } protected override void RenderContents(HTMLTextwriter writer) { base.RenderContents(writer) writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); visSaveButton.RenderControl(writer); writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); visSaveMessage.RenderControl(writer); writer.RenderEndTag(); writer.RenderEndTag();// tr writer.RenderEndTag(); } void saveButton_Click(object sender, EventArgs e) { string sqlMessage = "This is a test"; visSaveMessage.Text = sqlMessage; } protected override void OnLoad(EventArgs e) { base.Onload(e) this.EnsureChildControls } }
- Edited by Sean Sharepoint Thursday, August 12, 2010 9:10 PM finally cleanest
Thursday, August 12, 2010 9:03 PM
Answers
-
It seems I just had to delete "base.RenderContents" from the RenderContents method, and all started to work.
Thanks!
- Marked as answer by Aaron Han - MSFT Tuesday, August 17, 2010 6:35 AM
Monday, August 16, 2010 7:07 PM
All replies
-
You must create the control in CreateChildControls and you need to add it to the Controls collection.
Button visSaveButton = null;
protected override void CreateChildControls
{visSaveButton = new Button();
visSaveButton.Click += new EventHandler(saveButton_Click);Controls.Add(visSaveButton);
- Proposed as answer by Doug WareMVP Thursday, August 12, 2010 9:39 PM
Thursday, August 12, 2010 9:39 PM -
BTW, don't call this.EnsureChildControls in OnLoad. You should only use that method in cases where you need to access a control's properties before it would ordinarily be made. In many cases, having to use it at all is a sign that you need to refactor your code.Friday, August 13, 2010 12:05 AM
-
Great, thanks.
But how to I render the control where I want it? With just adding the Controls.Add(visSaveButton), it puts the control where I want it (because of rendercontents method), and at the top of the page as well.
thanks
Friday, August 13, 2010 2:33 PM -
I'm not sure what you are asking. If you don't have RenderContents the Web Part renders its contents in the order you add them to the Controls collection. You have a RenderContents method, so it will render in your table.
If you see the button twice, I'm going to guess and say you wrote: Page.Controls.Add. Every control has a Controls collection (a page is like a tree). You should write: this.Controls.Add(visSaveButton), or just leave off 'this.'
Friday, August 13, 2010 4:37 PM -
I am overriding RenderContents, and I have tried this.Controls.Add(visSaveButton); as well as Controls.Add(visSaveButton); and same results, it renders twice, once in the table where I want it, and once directly above the table.
Friday, August 13, 2010 8:16 PM -
Please post your complete code as it currently exists.Friday, August 13, 2010 8:57 PM
-
I also cannot get these text_changed events to fire, what am I doing wrong?
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Web.UI; using System.Web.UI.WebControls.WebParts; using System.Web; using System.Web.UI.WebControls; using SqlData; using Microsoft.SharePoint; using DBConnectWebPart; namespace DBConnectWebPart.UI.WebControls.WebParts { /// <summary> /// /// </summary> [Guid("57a694fc-f762-42d5-b3e4-16a2b9fe934e")] public class DBConnectWebPart : Microsoft.SharePoint.WebPartPages.WebPart { string phoneFlagAtSave = "test"; string homeAddFlagAtSave = "test"; //Overview variables int employeeId = 0; //Visibility Settings Controls Label visHead; Label visHomeAdd; Label visHomeNum; Label visSaveMessage; DropDownList _visHomeAdd; string _visHomeAddValue; DropDownList _visHomeNum; string _visHomeNumValue; Button visSaveButton; protected override void OnInit(EventArgs e) { if (!_error) { try { base.OnInit(e); //fetches an employee record and creates the MOSS profile object MossProfile profile = Helper.FetchProfile(connectionString, accountName, false); //map MossProfile Properties to _field values employeeId = profile.EmployeeId; _visHomeNumValue = profile.HomePhoneVisibilityFlag; _visHomeAddValue = profile.HomeAddressVisibilityFlag; } } catch (Exception ex) { error.Text = "Error Message: " + ex.Message + " ; Inner Exception: " + ex.InnerException.Message + " ; Stack Trace: " + ex.StackTrace; EventLogWriter.WriteToEventLog(error.Text); } } } protected override void CreateChildControls() { if (!_error) { try { base.CreateChildControls(); #region Visibility Settings Control Values //Visibility Settings Control Values string[] visSettings = {"test", "Only Me", "My Manager", "Everyone"}; visSaveMessage = new Label(); visSaveMessage.Text = string.Empty; visHead = new Label(); visHead.Text = "Visibility Settings"; visHead.Font.Name = "Calibri"; visHead.Font.Bold = true; visHead.Font.Underline = true; visHead.Font.Size = 12; visHomeAdd = new Label(); visHomeAdd.Text = "Home Addresses Visibility Setting: "; _visHomeAdd = new DropDownList(); _visHomeAdd.DataSource = visSettings; _visHomeAdd.TextChanged += new EventHandler(_visHomeAdd_TextChanged); visHomeNum = new Label(); visHomeNum.Text = "Home Phone Number Visibility Setting: "; _visHomeNum = new DropDownList(); _visHomeNum.DataSource = visSettings; _visHomeNum.TextChanged += new EventHandler(_visHomeNum_TextChanged); if (!Page.IsPostBack) { _visHomeAdd.Text = _visHomeAddValue; _visHomeNum.Text = _visHomeNumValue; _visHomeNum.DataBind(); _visHomeAdd.DataBind(); } visSaveButton = new Button(); visSaveButton.Text = "Save"; visSaveButton.Click += new EventHandler(visSaveButton_Click); Controls.Add(_visHomeAdd); Controls.Add(_visHomeNum); Controls.Add(visSaveButton); } catch (Exception ex) { HandleException(ex); EventLogWriter.WriteToEventLog(ex.Message); } } } protected override void RenderContents(HtmlTextWriter writer) { base.RenderContents(writer); writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { visHead.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderEndTag(); // tr //End Row 14 //Start Row 15 writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { visHomeAdd.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { _visHomeAdd.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderEndTag(); // tr //End Row 15 //Start Row 16 writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { visHomeNum.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { _visHomeNum.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderEndTag(); // tr //End Row 16 //Start Row 17 writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { visSaveButton.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderEndTag(); // tr //End Row 17 //Start Row 18 writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); //Field writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); if (accountName.ToLower() == currentUser.ToLower()) { visSaveMessage.RenderControl(writer); } writer.RenderEndTag();//td writer.RenderEndTag(); // tr writer.RenderEndTag(); //table } void _visHomeAdd_TextChanged(object sender, EventArgs e) { homeAddFlagAtSave = _visHomeAdd.SelectedValue; //Doesn't get logged EventLogWriter.WriteToEventLog("_visHomeAdd_TextChanged event was fired with value: " + homeAddFlagAtSave); } void _visHomeNum_TextChanged(object sender, EventArgs e) { phoneFlagAtSave = _visHomeNum.SelectedValue; //Doesnt get logged EventLogWriter.WriteToEventLog("_visHomeNum_TextChanged event was fired with value: " + phoneFlagAtSave); } void visSaveButton_Click(object sender, EventArgs e) { _visHomeAdd.SelectedValue = phoneFlagAtSave; _visHomeNum.SelectedValue = homeAddFlagAtSave; _visHomeAdd.DataBind(); _visHomeNum.DataBind(); //Gets Logged EventLogWriter.WriteToEventLog("visSaveButton_Click event was fired with values: Phone: " + phoneFlagAtSave +" HomeAddress: " + homeAddFlagAtSave); string sqlMessage = Helper.UpdateVisibilityFlags(connectionString, employeeId, homeAddFlagAtSave, phoneFlagAtSave); error.Text = visHomeAddFlag + " " + _visHomeAdd.SelectedIndex + " " + visPhoneFlag + " " + _visHomeNum.SelectedIndex; visSaveMessage.Text = sqlMessage; }
I just want to pull in the values from the db initially, then allow a user choose their visibility settings from the dropdowns, then click the button to save the new values to the db, and then when the page comes back, have the newly chosen values visible in the dropdowns.
After postback, I would set the values on in CreateChildControls, but capturing the new dropdownlist.selectedvalue only seems to work from within the Text_Changed method, when testing on a ASP.Net web app tester project, but I cant get this event to fire in my code deployed to sharepoint (above).
Also the three controls that I register in the CreateChildControls method, appear twice, as I render them again in the RenderContents method, I just want them to render in the rendercontents method
Thanks a bunch in advance!
Monday, August 16, 2010 6:35 PM -
Update: The controls that get rendered on the page by the Controls.Add(); method (within CreateChildControls) work! Yet the ones that render in the rendercontents() method do not.
What are the difference between the two? Shouldn't they be the same? How do I render the first control in place of the second?
Thanks
Monday, August 16, 2010 6:55 PM -
It seems I just had to delete "base.RenderContents" from the RenderContents method, and all started to work.
Thanks!
- Marked as answer by Aaron Han - MSFT Tuesday, August 17, 2010 6:35 AM
Monday, August 16, 2010 7:07 PM