C# - Setting Class-Level Variable To Use Between Event Handlers?
Mar 17, 2010
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
}
}
Google usually solves my problems for me, but this one has me stumped. I have a page with the following code, in which lstPayments is a listview control:
As you can see, I'm trying to get an alert box displayed after a new payment is entered. As I expect, lstPayments_ItemInserted is executed first, and paymentWarning is duly set to true. However, when Page_PreRender subsequently executes, paymentWarning has been re-initialised: it's false again!
The only way I can get the class-level variable paymentWarning to retain it's value between the two event handlers is to declare it static, which I don't want to do for obvious reasons. There must be something I am failing to understand about how class-level variables work in aspx pages.
I have a site that when a user logs in it sets their initials into a session variable and sets the timeout value like so:
[Code]....
I want the user to be logged in for 3 hours. This does not work, the session expires after a short period of time, maybe 20 minutes. What do I need to change to make this page level validation work?I have tried setting in web.config also, but this doesn't work either.
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 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'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 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.
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).
We had a UAT and Production version of a .NET web application. UAT was taking around 5 seconds to run a particular operation while Prod was taking 35+ seconds.
This even happened when pointing both web applications at the same database and putting them both on the same machine.
The culprit was finally found to be the following entry, which was in the Prod but not UAT web.config
<trust level="High" originUrl="" />
why this would cause such a significant performance degradation??
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 situation where I dynamically load one of twenty user controls at a time in an ASP.net web page. Based on much reading I've done, I understand that I am to reload the user control upon postback via the Page_Init event handler. This I've done and it seems to work fine.
But now I would like to wire up assorted controls in the user controls such that when the value of each is changed, an event is fired and the web page is notified. Here's an example of how I'm doing that:
userControl.NewData_Handler += new EventHandler(UserControl_NewData_Handler);
There's a problem though. Because the user control is being done in Page_Init (ie. before Page_Load) I don't believe that a line of code such as the one above can function yet.
So I'm wondering what the best practice to do this is. It occurred to me that perhaps I could execute the line in the Page_Load event handler but I'm not sure if that's correct or not.
I was wondering if anyone had an easy way to wire up javascript event handlers to events happening on the server-side. I have a long running process that includes a lot of steps, and would like the client to be continually updated with new information as the steps transition. Will this involve some sort of polling mechanism?
I have two list boxes and I am using javascript to interchange the items. My problem is, When I press submit button before any changes in the listboxes, it would fire the eventhandler. But when I made any change in these listboxes, a postback happened and the controls became invisible. (There is an html tag and an empty body tag in the source). I know listbox cannot preserve the client side changes to the server. But I could not identify the problem.
I have a ASP.NET content page where the master page is set dynamically. Both master pages contain a print button and an associated event handler for the click event of the button. Unfortunately I receive a run-time error when I attempt to dynamically access the event from the master page that was not initially assigned. Below are code snippets:
Page_Load(): Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim strPageTitle As String = "Evaluator Data Form - Instructions" If Page.MasterPageFile.Contains("masEvaluators.master") Then Dim mp As Evaluators_masEvaluators = CType(Me.Master, Evaluators_masEvaluators)
[code]....
which produces the following error when I load the page and reference the "masStaff.master" master page:
System.InvalidCastException: Unable to cast object of type 'ASP.staff_masstaff_master' to type 'Evaluators_masEvaluators'. at Evaluators_EDF_Instructions.Page_Load....
I can solve the problem by adding a print button to the content page, but that defeats the purpose of using a master page.