User Control's Elements Not Getting Initialised When Added Dynamically?
Jun 30, 2010
I've got a custom ASP.Net web user control I've built; done this enough times before but this one is misbehaving and I can't spot why.
Where the calling page includes the user control directly in its markup, all is well and the control behaves as expected.
However if the page adds this particular control dynamically (to a placeholder in the master page, which is what's calling this whole thing) the elements within it stay firmly NULL - nothing from the user control gets written to the client at all, including static content within the user control.
I have a user control say SearchVendor.ascx which contains 4 buttons a gridview and another user control. I need to load the control dynamically actually as a modal pop up
I get this code
var uc = Page.LoadControl("~/blah/VendorProductSearch.ascx") as VPSearch; uc.ShowVPSearch(true); _tempPlaceHolder.Controls.Add(uc);
it works fine the control gets loaded properly but onclick of any button the second time the control disappears ?
I want the dynamically added control to remain until the user clicks on the cancel button
I have a GridView of thumbnail photos within an UpdatePanel, with clickable icons in each row which each load a User Control containing a small Google Map into the relevant row. The idea is that the user can geotag (by clicking on the map) any photo in the GridView.
In the map User Control, there is some Javascript initialising the map:
function initializeMap() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById('Map'), {size: new GSize(336, 200)}); // set the map controls, set the centre, etc. } }
Problem is: I don't know how to call the initializeMap() method. Because it's dynamically added to the page, any attempt to link it to the calling button by "onClientClick=initializeMap()" for example, gives a JS error, saying the method isn't defined.
I have a composite user control consisting of three standard table cells (a legend, an image with a tool tip, and a text field control). If I add these to a TableRow in my aspx page it works fine and produces legal HTML in my source. The below works fine ...
However when I try to do the same programmatically (C#) the TableRow won't accept anything in its Controls collection that isn't a TableCell. I could make my control a nested table in its own right but I lose the alignment of my form items on the page with multiple controls, as each table aligns itself according to its contents. Is there anyway I can make the TableRow accept my control as collection of cells or do I need to do some casting or making my user control inherit some kind of TableCell attributes? I can also dynamically add my controls to a TableCell item which actually displays OK in IE but creates illegal HTML (<td><td></td><td> ... </td></td> - I assume this is illegal) in my resulting source. The code below DOES NOT work ...
I have a user control, which is added dynamically, but I have noticed that when it is on the page and viewing the source that none of the controls within have been given unique ids. How do I give my user control and the controls within unique ids in order that I can use them in my events?
I am trying figure out how I handle events in a dynamically added user control. Basically I can add user controls dynamically to my form (I am then storing them in an ArrayList in a Session variable that I use to reload them on my Page_Load). Each control has a button on it. However, whenever I click the button, the event never fires (code is never reached). I assume it has something to do with the control being dynamic, and when I click a button, it goes out of scope, and when I reload it something is lose in the event handling.
Here's my code for adding a user control:
Code: Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load Dim alContact As New ArrayList If Not IsPostBack Then ' Dummy controls for testing Dim oContact As New ASP.ContactControl
I have a C# web application that dynamically adds user controls to the default page for whatever "mode" the application is in. The problem is that it is not persisting these across postbacks. How do I persist these across postbacks and keep the content of the controls that are in the user control?
For instance, say I have a user control that creates a new tour record. The user clicks on the Tour item from the menu on the default page, it dynamically loads the tours user control. The user then fills out the form in the tours user control and clicks save. This is where the problem happens. When the postback occurs, the web application has no idea that the new tours user control was ever loaded. So, no save takes place because the Save button's click event never even gets fired.
I have ONE <asp:Button ID="btnAddUC" runat="server" ......./> and ONE <asp:Table ID="tblUC" runat="server"...> on my page. User clicks on btnAddUC, user control is added to the page [user can add 'n' user controls to the page]. here I have no problem, adding user controls to the page on user clicks.
My user control has ONE <asp:DropDownList ID="ddlItems" runat="server" ......./> and ONE <asp:CheckBoxList ID="chkItems" runat="server"..../>. I am exposing "ddlItems" by public method, "chkItems" is not exposed. "chkItems" is binded on SelectedIndexChanged event of "ddlItems".
Execution scenario:
User adds user control to the page, select item from the "ddlItems" ( Note: "ddlItems" is exposed by public property ) , "chkItems" is populated ( using ddlItems.SelectedItem.Value ) . User checks some checkboxes in "chkItems" and then decide to add one more user control. When the second user control is added to the page, checkboxes in the first usercontrol lose their state and apeears unchecked (NOTE: user checked some checkboxes and then added another user control).
I want to put checked beckboxes index in session ( Before another control is added, which event I should use, because at LOAD event there is nothing).
I was able to restict SelectedIndexChanged event to only that user control whcih generated it (checking _EVENTTARGET)
I know that if I re-add the control during Page_Load, the posted values will be repopulated when the page is rendered; however, this is not the case when re-adding the control during the Click event and I need to add the control during an event handler.
While I am using a "Telerik" control here it shouldn't be any different I guess;
[code]....
What happens is that the control is created and rendered;
When I change value in the Combo box a Post-Back happens.
HOWEVER, the event RadComboBoxSelectedIndexChanged does not fire. Also when I am back at the page the new value is not saved; Obviously, i recreate the control every time. If I don't I get a ViewState error. Seems to me that there some ViewState management problem, but I cannot identify it...
I'm creating an ASP.NET control dynamically based on a value selected in a dropdown; for instance the field can be a textbox or a checkbox (for now), and then it gets added to a placeholder control. However, I'm unsure how to retrieve the value - using the placeholder's FindControl method returns null although I'm specifying the ID when I create the control.
I am writing a survey generating system in asp.net. i asked an ealier question about the best way to create controls that can be passed about as variables. This was problematic with user controls so i was advised to use custom controls and a quick way to do this was to inherit from the panel control and just add a bunch of standard controls the the controls collection by overriding the CreateChildControls method. This way i could create my "survey" controls,which are basically Questions in the survey. THe question controls are then dynamically added to the page. This all works well but know i have come to the point that i want to try and retrieve the values from these controls and i seem to be lost in a nether world of of viewstates and page lifecycles. I can ensure that the dynamically added text boxes have a known ID, however even if i add the parent control in the page init handler the CreateChildControls method does not run until after until after the viewstate is loaded. I cannot work out how to retreive the values from these text boxes.
I have created an asp.net application which contains a user control. Within the application this control works fine. I have then moved the control into a separate "control library" project. When I try to load the control from the control library I find that the asp elements defined in the ascx for the control are not instantiated - i.e. I get a null reference exception in the Page_Load event handler. The only changes that I have made to the original application are to reference my control library and to change the <%@ Register statement in the loading page to reference the control library dll:
[Code]....
Do I need to do something else to get the user control to initialize itself correctly?
I have a control that handles commenting. In this control, I have set a delegate event handler for sending an email.
I then have various types of controls, e.g. blog, articles etc, each of which may or may not have the commenting control added (which is done dynamically with me not knowing the id's), i.e. the commenting control is added outside this control. Each of these controls handles it's emailing differently(hence the event).
What I'm trying to determine, is how to assign the event in the parent control. At the moment, I'm having to recursively search through all the controls on the page until I find the comment control, and set it that way. Example below explains:
COMMENTING CONTROL
public delegate void Commenting_OnSendEmail(); public partial class Commenting : UserControl { public Commenting_OnSendEmail OnComment_SendEmail(); private void Page_Load(object sender, EventArgs e) { if(OnComment_SendEmail != null) { OnComment_SendEmail(); } } }
PARENT CONTROL
public partial class Blog : UserControl { private void Page_Load(object sender, EventArgs e) { Commenting comControl = (Commenting)this.FindControl<Commenting>(this); if(comControl != null) { comCtrol.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail); } } }
EDIT:
The reason I ask is that if I search from this.Page as the initial control, I am worried about time taken to search down the control tree to find it. Each different type of page would be different in how many control it would have. On some testing, it returns back quite quickly the result.
I just recently started messing around with .NET (converted over from PHP) and I'm really enjoying it. I've created a test site for some friends at work and it works great. But I've been slowly converting the pieces of the site into user controls. I've moved some DataGrid elements to user controls for their specific purposes, and now I'm working on the main page (I'll attempt to copy the code below).
So pretty much this control displays:
1. An error panel
2. A podium panel (gold, silver, bronze) medals
3. A cake podium (the person who gets last place)
Before I moved this to a user control it worked perfectly. The Image files were updated from the SQL results. Believe me, I know it's not optimized so lets skip over that part. But when I view the dev site, the images are showing up as blank or broken. Nothing I do to change one of the ASP elements in the user control are being updated. I have a Response.Write sitting there just to ensure that the events are being caught and handled correctly.
I am having datagridview control with dynamically added BoundField columns.I want to have tetxboxes in each cell of the gridview so taht user will enter data in gridview textboxes and at last on button click it will be saved in database.
I have a web user control menu of page. Now I want HOME (which is an hyperlink text) in menu to be Bold at the time default.aspx Loaded (Load event)! How can I do that If any one can provide code! I am using VB .Net at back.
I have a gridview that on it's RowDataBound event I dynamically add Image Controls to some columns.
The problem is that I lose these images on the next PostBack.
OBS: The GridView's EnableViewState propertie is already set to true
I know about the page lifecycle, but how can I persist these images if I have to add them on the RowDataBound event?
In addittion, if I add a static TemplateColumn with an Image Control and I set it's ImageUrl propertie inside the RowDataBound event it will obviously persist between postbacks. The problem is that I don't know how many columns with images I'll have, it's defined on the datasource.