Finding Html Element OnPreRender State Of User Control?
Sep 9, 2010
I have a user control which has html elements like <input type="button".... and i want to set its display property on preRender state.Would you please explain, what kind things i have to handle this user control? So, in this functionprotected override void OnPreRender(EventArgs e) { }
I have only EventArgs e and it doesn't have proper method or properties to bring me the html of user control.
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="test.ascx.cs" Inherits="UserControls_test" %> <p id="XXX">aaa</p>
and here is the contents of my test.ascx.cs file:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class UserControls_test : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { this.XXX.InnerHtml = "BBB"; } }
I get an error when I refer to the id, "XXX" (underlined above) in code behind which reads: 'UserControls_test' does not contain a definition for 'XXX' and no extension method 'XXX' accepting a first argument of type 'UserControls_test' could be found (are you missing a using directive or an assembly reference?)
I have tried XXX.InnerHtml and I have tried this.XXX.InnerHtml and get same problem.
How do I successfully refer to ID'ed HTML elements in code behind?
my user controls are derived from System.Web.UI.WebControls.WebParts.WebPart which makes them webparts.I have everything setup and working fine as far as the personalization and webpart goes... every thing displays and works fine.Except that 1 of my control needs to do a bit of work in the OnPreRender event and it turns out that event only gets fired when a user is loged in the application.
Protected Overrides Sub OnPreRender(ByVal e As EventArgs) If Not Me.DesignMode Then Me.isloaded = True ' Test for ScriptManager and register if it exists sm = ScriptManager.GetCurrent(Page) [code]...
My observation so far in the output rendered by a datalist (when I use this user control inside it) is that the value for the name attribute is the same.I want to use this control inside a datalist/repeater such that I'd want a unique value for the input element's name attribute when the datalist/repeater renders. How is this done?
EDIT: My bad obversation. Actually the names are unique. However, when I try to post the page to another web page which outputs the key & value of all the items in Request.Form I don't see the input elements...
public class CustCtl : WebControl { protected override System.Web.UI.HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Div; } } }
With this bare bones control, it would render the root element as a Div tag. But how can I add attributes to that root HTML element that this control will render .
Two separate questions, but sufficiently intertwined that I'm going to try the two together....
Firstly - User Controls and Behaviours
I have a User Control which contains a few visual controls. I am attaching some behaviours by using GetScriptDescriptors and am passing some JavaScript to the browser using GetScriptReferences. That is all rock solid and working well. However, when developing, I did discover that I couldn't attach the ehaviours to the User Control itself - not surprising as rendering a User Control does not create a DOM element which represents the actual control. So, I have attached my behaviours to a "random" TextBox within the User Control.
So - first question, is there a better way to do that? For example, should I always be rendering a SPAN as an element to surround the control? Not sure what that would do to the robustness of the rendering. What is the right way to attach a behaviour to a User Control.
Secondly - Accessing those same Behaviours later
Assume I have placed a User Control on the page. That User Control exposes a Property (actually a Javascript Function of course) which does "something" to the control - for the sake of example we'll say that the function is set_Border(colour). I then have a behaviour on the same page (actually an Extender on a different control) which needs to call the function. I have a reference to the User Control in my script, so I have tried TheControlReference.set_Border('red') and find that my control doesn't support the set_Border method.
I guess this is probably because the behaviours are not attached to the User Control itself, but to a GUI element within it. Hence, I suspect that the answer to the second question lies within the answer to the first.
My original understanding was that the asp.net page lifecycle is run once for all pages and controls under normal circumstances. When I attached a control during a container's OnPreRender, I encountered a situation where the control's OnInit was not called. OK, I considered that a bug in my code and fixed as such, by attaching the control earlier.
But just today, I encountered a situation where OnInit for a control seems to be called after the normal OnInit has been done for everyone else. See stack below. It seems that during the page's PreRender, the control's OnInit is called as it is being dynamically added.
So I just want to confirm exactly what ASP.NET's behavior is? Does it actually keep track of the stage of each control's lifecycle, and upon adding a new control, it will run from the very beginning?
[HttpException (0x80004005): The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.] System.Web.UI.ControlCollection.Add(Control child) +8678663 MyCompany.Web.Controls.SetStartPageWrapper.Initialize() MyCompany.Web.Controls.SetStartPageWrapper.OnInit(EventArgs e) System.Web.UI.Control.InitRecursive(Control namingContainer) +333 System.Web.UI.Control.InitRecursive(Control namingContainer) +210 System.Web.UI.Control.AddedControl(Control control, Int32 index) +198 System.Web.UI.ControlCollection.Add(Control child) +80 MyCompany.Web.Controls.PageHeader.OnPreRender(EventArgs e) in System.Web.UI.Control.PreRenderRecursiveInternal() +80 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842
We have a web site that implements a custom SiteMapProvider using a User Control added in the master page. I need to be able to limit the sitemap nodes added depending on the logged in user, that is, certain users should not see certain sitemap nodes. Currently, the login processing code determines if users are in the certain category or role and then sets a value in session state, for example, Session["UserInRoleXXX"] = "Yes"; I tried changing the code in the user control to check the session state, but I got the following error: NullReferenceException ... Object reference not set to an instance of an object." Can session state be accessed in a user control?
In my application(ASP.NET 3.5) I have a User Control(ascx) that I have on a number of pages. Sometimes I need to reference certain label from the page ascx is on.
I have a application which uses webparts and 1 control is also a Script Control.So my user controls are derived from System.Web.UI.WebControls.WebParts.WebPart which makes them webpartsI have everything setup and working fine as far as the personalization and webpart goes... every thing displays and works fine.Except that 1 of my control needs to do a bit of work in the OnPreRender event and it turns out that event only gets fired when a user is loged in the application
I have a nested table structure, a part of which is rendered by a ajax call that returns HTML from the server. The markup looks like this:
<tr> <td><table cellpadding="0" cellspacing="0" border="0"> <%-- Content will be displayed from ajax call 1 --%> <%-- Content will be displayed from ajax call 2 --%> </table> </td> </tr> </table> .. more html
In jquery, I need to insert this html for which i need an element to traverse to so that I can call the html() of that element. Unfortunately, if I use a div, for example:
<table cellpadding="0" cellspacing="0" border="0"> <div id="divAjax1"> <%-- Content will be displayed from ajax call 1 --%> </div> <div id="divAjax2"> <%-- Content will be displayed from ajax call 2 --%> </div> </table>
the classes are setup such that the div or a span causes other issues.
I have a Master Page that has several User Controls on it. The MasterPage code behind does some work to calculate a value that needs to be used in all of the UserControls. From the UserControl code behind, how do I access the public property of the MasterPage that I have set?
I have created a web user control I want to change the iframe' src value when the user click on the link but the problem is that I dont have access to iframe inside the page from web user control I think there is a way because my control is in the page they have some relation perhaps I like to find something like this :
I have a user control that I am explicitly calling from an aspx page. In page_load of the aspx page I have the following: myControl = (DynamicTable)Page.LoadControl("../inc/DynamicTable.ascx");
Then in my code where I want it to execute the control, I have this: pnlESDDEnrolled.Controls.Add(myControl);
where pnlESDDEnrolled is the panel I am loading it into for display. So, I execute the aspx page, it links off to the user control, populates the control, returns back to the aspx page and the page displays with the user control in the middle of it. All is well.
The problem comes in when updates are made on the user control. Keep in mind, that other data is updated on the page as well, and the update button resides on the page, not the control. Anyway, when the update button is pushed, the button_click event is fired on the page, but the updates that I made on the user control are lost. Since the page loaded the user control and then the usercontrol executed the page unload method, the page has no knowledge of the user control anymore. Thus, when the update button on the page is pushed, I guess I am not really sure what happens with the updated data on the user control. All I know is that it is lost.
Using the HTMLHelper's strongly typed methods on an instance of UserAccount my HTML elements are given IDs like:
id="PhoneNumber" id="Credentials.Username"
This is awesome, it's great really. What I want is to be able to generate the same ID for a property in my controllers. My purpose is to link some additional error messages to the ID's. I can always just guess what it will be and enter it into the code, but I prefer to have a strongly typed way to do this. Does on exist?
I have created a user control with a property named CurrentPage. When a link button is clicked it runs PostbackToPage() and passes a command argument in which then sets the CurrentPage property with this new value. On the page which uses the user control I am trying to display the updated CurrentPage property after a postback. When I click the link button to cause the postback the CurrentPage is the default value. However when I click it again it works as expected. So it seems to only work after 2 postbacks. How can I get this to work after the first postback?
1) I found that my viewstate was not being persisted across postbacks for web user controls. I ensured that the Enable Viewstate property was set to true (of the page)
2) The Viewstate isnt being persisted on the 1st postback.
3) However, it is being persisted from the 2nd postback onwards.
I stepped through the code to ensure that the Viewstate had the 2 keys that I was adding on page load. However, on the 1st postback, the viewstate is empty. Everything is ok from the 2nd postback onwards.
But the problem is, I create the ID dynamically and I have multiple tables with IDs like "table1","table2", and so on....
string idFromDB = ... // retrieve the number from the database string fullId = "table" + idFromDB; HtmlTable tbl = .... get the element based on fullId .... ?????? tbl.Rows.Add( ... );