We help IT Professionals succeed at work.

Session Variable Question, asp c#

308 Views
Last Modified: 2014-11-21
In a list box, after I click on First_Name, the following stores the text value (Angela in this example)  in a session variable dictionary object named settings:
    private void ListBoxTextChangedChanged(object sender, EventArgs e)
    {
        ListBox lb = (ListBox)sender;
        string name =lb.ID;
        name = name.Substring(3);
        int index = lb.SelectedIndex;
        settings[name] = lb.Text;
        Response.Write("1. " + settings["First_Name"].ToString());
        Session["MySettings"] = settings; 
    }

Open in new window

Soon after the click I get the following on the screen because of Response.Write(...) in these events:
2. All    //<-- All means no selection is made.
1. Angela

Please see below for Page_Load:
        if (IsPostBack)
        {
           settings = (Dictionary<string, string>)Session["MySettings"];
           Response.Write("2. " + settings["First_Name"].ToString());
            settings = HttpContext.Current.Session["MySettings"] as Dictionary<string, string>;
            AddListBoxes(listBoxes,"PstBack");
        }

Open in new window


Question: How can I change my code in Page_Load to have a print out like:
 
2. Angela
      //<-- why this still shows All
1. Angela
Comment
Watch Question

jitendra patilSr Software Engineer
CERTIFIED EXPERT
Top Expert 2013

Commented:
may be this is because you page is reloaded again on the selection changes in listbox, just try to change the below line of code
if (IsPostBack)   to if (!IsPostBack)

try the above one if it helps or  just post your markup code also.
Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
Presumably it is printing out like that because of the sequence of events.
Page_Load fires before SelectedIndexChanged so it will always show the value from the dictionary as it was prior to the selection of a new item.
Mike EghtebasDatabase and Application Developer

Author

Commented:
I have selected "Angela" upon which Page_Load gets fired. Here I am expecting "Angela" to be printed not All. So, basically I think the problem is related to my session variable coding.

Is my session variable coding correct?

Mike
Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
As I said the reason it is behaving as it is is because of the sequence in which the events fire.
Your Session value isn't updated until the SelectedIndex event fires. But Page_Load fires before SelectedIndexChanged hence your Session variable hasn't been updated by the time you try to display the value.

So, assuming you have All in you dictionary, the sequence is currently:

1) You click "Angela" in the ListBox
2) The page posts back and Page_Load executes
3) Page_Load outputs "All" because that is what is currently in the Session
4) SelectedIndexChanged fires, which updates the Session with the value "Angela"

So, basically, Page_Load will always show the value that is in the Session before SelectedIndexChanged updates it.
Mike EghtebasDatabase and Application Developer

Author

Commented:
I think step 1a is missing:
1) You click "Angela" in the ListBox
1a) "Angela" enters into settings dictionary variable in the same ListBox event.
(And, settings ought to be available with "Agela" in it in postback = true of  Page_Load. But why it is not?)
2) The page posts back and Page_Load executes
3) Page_Load outputs "All" because that is what is currently in the Session
4) SelectedIndexChanged fires, which updates the Session with the value "Angela"
Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
Step 1A wasn't missing, that is the whole point.

"Angela" is put into the dictionary in the ListBox event, but that event fires after the Page_Load event. So the updated value isn't available in Page_Load.
Mike EghtebasDatabase and Application Developer

Author

Commented:
Does StateView remembers "Angela" was selected in Page_Load?
Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
You can access the ListBox directly from Page_Load and retrieve the value that way.
i.e. In Page_Load:
ListBox lb = this.<name_of_your_listbox>;
string value = lb.Text;

Open in new window

Mike EghtebasDatabase and Application Developer

Author

Commented:
1. User clicks on an option (presumably session variable of some kind ought to remember it).
2. Page_Load fires (because Postback is true, it is expected that the session variable to have the selected value).

If above statements are correct, please help me with its coding.

Thanks,

Mike
Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
>> If above statements are correct
The above statements aren't true.

Nothing gets put into the session automatically.  The data from the page is sent to the server as part of the Request object.  The page and its controls are then reconstructed based on the data sent from the client.

Next, the page initialization events fire, followed by Page Load, followed by any events for individual controls.  

Page load does not have the up-to-date session value because the session value is set by a Control event, which runs after the Load event
Mike EghtebasDatabase and Application Developer

Author

Commented:
Carl,

My apology for not following it; no doubt you are correct. What I want to give me something that works.

What I want is to click on the listbox and this action supplies my selection as a criteria to my rest of the code to filter accordingly.

Just to let you know, I have all code stuff taken care of. The problem I am having is I have to click on a "Angela", for example, but the screen refreshes without being filtered. However on a second click it does.

About second click, if I click again on "Angela", of course, the event will not fire and I have to click on any other item.
Senior Systems and Integration Developer
CERTIFIED EXPERT
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Mike EghtebasDatabase and Application Developer

Author

Commented:
Thank you for your patience.

Gain unlimited access to on-demand training courses with an Experts Exchange subscription.

Get Access
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Empower Your Career
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE

Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.