Solved

Session Variable Question, asp c#

Posted on 2014-11-19
13
281 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
0
Comment
Question by:Mike Eghtebas
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 6
13 Comments
 
LVL 13

Expert Comment

by:Jitendra Patil
ID: 40454394
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.
0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40454507
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.
0
 
LVL 34

Author Comment

by:Mike Eghtebas
ID: 40454514
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
0
Monthly Recap

May was a big month for new releases from Linux Academy! Take a look at what our team built recently in our blog. You can access the newest releases from our blog.

 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40454530
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.
0
 
LVL 34

Author Comment

by:Mike Eghtebas
ID: 40454556
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"
0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40454578
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.
0
 
LVL 34

Author Comment

by:Mike Eghtebas
ID: 40454594
Does StateView remembers "Angela" was selected in Page_Load?
0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40454604
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

0
 
LVL 34

Author Comment

by:Mike Eghtebas
ID: 40454670
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
0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40454772
>> 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
0
 
LVL 34

Author Comment

by:Mike Eghtebas
ID: 40457875
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.
0
 
LVL 52

Accepted Solution

by:
Carl Tawn earned 500 total points
ID: 40458248
If you are simply wanting to filter the data on the current page, then you don't need to use the Session at all.  You can simply grab the currently selected value from your list at any point on the page and use it to filter.

The listbox, and its selected valued, are passed back to the server each time the page is submitted. Therefore you don't need to store it in the Session, you can simply grab the value from the control when needed.

Something like:
private void Page_Load(object sender, EventArgs e)
{
     // grab the currently selected value from the listbox
     // assuming your list box is called "lstFirstName" - adjust to suit your code
     string selectedValue = this.lstFirstName.Text;
     
     FilterSomeData( selectedValue );
}

Open in new window

Hope that makes sense.
0
 
LVL 34

Author Closing Comment

by:Mike Eghtebas
ID: 40459033
Thank you for your patience.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…

628 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question