C# - Should Add Control Event Handlers Programmatically Within Page_Init
Jan 10, 2010
I want to add event handlers programmatically to the server controls rather than using their predefined OnClick properties, etc. But which would be considered a better practice for defining handlers:
I am creating a hierarchial grid dynamically. I was able to add a gridview within a gridview. Now how can I create the gridview's rowcreated event handler programatically? I need it to be dynamic, depending on the number of levels of hierarchy I will add gridviews and their events. How can I do it?
the event names will be dynamic like GridView*_RowCreated.. where * will replace by a number of gridviews.
I need to dynamically instantiate a web application from a console application. By this definition, I mean that my console application contains a web application that is not bound to IIS/XSP.Currently, I create the web application into a temporary directory and copy some forged files into it. These are a special Global.asax that maps to my own implementation of HttpApplication to use in the web application (I need to do some initialization at app start), then I forge special .asmx files that map to my own skeleton classes and dynamic plugins
foreach (IPlugin plugin in _target.Plugins) { WsdlSkeletonDefinition[] defs = plugin.GetWsdlSkeletons();
My approach works, but I'm not so satisfied by it because I have to write lots of garbage into file system, even if I eventually delete it all.I know I can control HTTP handlers via Web.config, but I don't want to forge a Web.config for that. I would like to create a mapping such as I can remove the .asmx extension from web services' URLs and still get them.For example, one of the default scripts is "LogbusManagement.asmx", which must be hard-coded into client APIs and the .asmx prevents portability to other platforms such as PHP. I want to make "LogbusManagement.asmx" equivalent to "LogbusManagement" and any extension. For this, I might use an HttpHandlerFactory.
My straight question is,like asked here by somebody else: is there a way to programmatically, possibly from Global.asax, to set IHttpHandlers or IHttpHandlerFactories for web applications?
I m trying to load a new tab which should load WebUserControl2.ascx on button_clickbut I m coming across this eror: A Zone can only be added to the Page in or before the Page_Init event.I have a webpart in WebUserControl2.ascx which should load FeaturedControl.ascx.Well, i m getting the error when i click on button at :
Private Sub LoadTab2() Dim uc2 As UserControl = CType(LoadControl("WebUserControl2.ascx"), UserControl) tp2.HeaderText = "Tab2" tc1.Tabs.Add(tp2) tp2.Controls.Add(uc2) End Sub
When we double click to page It creates an empty Page_Load event codeblock automatically. Or you know can create other control's event subroutine events by clicking the relevant event in properties window.
but how can we create a Page_Init ? is there an automatic way ? or should we just write its name and parametes manually is the only way ?
I've been programming ASP.NET for a number of years and have got into the habit of using the public access modifier when writing event handlers for nested controls. e.g.
LinkButton ln = new LinkButton(); ln.Click += new EventHandler(LinkClick); .... public void LinkClick(object sender, EventArgs e)
I think I started using public because I ran into errors when using other modifiers. Is this the correct one to use here? Does it depend whether you're writing a Page / UserControl / other?
I've been working on a web form that has lost it's ability to respond to most event handlers, though code that I write in Page_Load still fires. No button click or text changed events will fire. This has been working for months, and suddenly stopped. I did a windiff comparison to an older version of the webform, and don't see anything suspicious.
I'm having a hard time understanding why the following code doesn't work. I'm sure it's something remedial that I'm missing or not understanding. I currently have a page that asks for user input. If, based on the input and logged in user, I find data from this page already in the database, I need to update the existing records rather than creating new ones, so I set a class-level bool to true. The problem is, when MyNextButton is clicked, PreviouslySubmitted is still false. So, I'm not sure how to make the value of this variable persist.
public partial class MyForm : System.Web.UI.Page { private bool PreviouslySubmitted; protected void Page_Load(object sender, EventArgs e) { MyButton.Click += (o, i) => { q = from a in db.TableA where (a.SomeField == SomeValue) select a; if(q.Any()) { PreviouslySubmitted = true; //populate the form's fields with values from database for user to revise } } MyNextButton.Click += (o, i) => { //the value of PreviouslySubmitted is false at this point, //even if I made sure it was set to true the previous postback if(PreviouslySubmitted) { //update database } else { //insert into database } }
reading on the forums about assigning event handlers to controls that are dynamically created via code and am just not getting anywhere.In my particular case, I'm rolling through a directory of images and creating ImageButton controls on the fly and want to assign the OnCommand event to a single handler.Then, by using the CommandName (which is different for each control) I can figure out which ImageButton was clicked and act accordingly.
The snippet below (which can be found in many posts on this topic) is inside a foreach which loops through the directory and gets each FileInfo (fi).Each is then added to a PlaceHolder (phImages).
[Code]...
This code compiles and runs but the event handler is never invoked when an ImageButton is clicked. I believe this is because you cannot, without some coding I'm not familiar enough to do yet, assign a handler to multiple controls.I say this because I ran into a similar problem in a Silverlight app I wrote and had to use a lambda (=>) operator to do something similar (although I admit to not knowing enough about this to know if this situation is the same).
The textbox has an onblur event (the workings of the onblur event are irrelevant), and an associated RequiredFieldValidator. This code functions exactly as it should. However,if in the body onload event I simply raise an alert of the innerHTML of tr1 or td1, the onblur event does not appear (but it does work, and can be seen when I view source in IE7). If I remove the RequiredFieldValidator, the onblur event handler is shown in the alert, or if I retain the validator but change onblur to onfocus, then the event handler also appears in the alert. I need this to work as when the user increases the Quantity, duplicates of the table row are added (I have tried both cloneNode, and setting the innerHTML of each new table cell to that of the original, but as my alert proves, the onblur event handler is not included in what is copied). The same problem also occurs with onchange for select tags with validators. I am using Visual Studio 2008 (.Net 2), IE7 and IIS 7.
Coming from WinForms/WPF I've learned the hard way that not remembering to unhook event handlers can lead to memory leaks.
Does this apply to Webapps too? It seems like when the request ends, everything (non-static) should be eligible for garbage collection. Is that true?
I remember jumping through all sorts of hoops to ensure that events got unhooked when an object goes out of scope, especially with multi-threading going on to ensure a responsive UI. Is all of that still necessarily in a webapp or is that one of the luxuries of working with a (mostly) RESTful model?
I have a detailsview control which I use to enter data and save to the database. The control is connected to the db through a objectdatasource. When the insert is successful, I want to set some variables and redirect the page to a different one. The detailsview control has AutoGenerateInsertButton="True". I don't know how to access the insert button click event in the code behind,
I have a gridview that includes dynamically created dropdownlist. When changing the dropdown values and doing a mass update on the grid (btnUpdate.click), I have to create the controls in the page init so they will be available to the viewstate. However, I have several other buttons that also cause a postback and I don't want to create the controls in the page init, but rather later in the button click events.
How can I tell which control fired the postback while in page_init? __EVENTTARGET = "" and request.params("btnUpdate") is nothing