[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 290
  • Last Modified:

Session Variable Question, asp c#

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
Mike Eghtebas
Asked:
Mike Eghtebas
  • 6
  • 6
1 Solution
 
Jitendra PatilSr.Software EngineerCommented:
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
 
Carl TawnSystems and Integration DeveloperCommented:
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
 
Mike EghtebasDatabase and Application DeveloperAuthor 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
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
Carl TawnSystems and Integration DeveloperCommented:
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
 
Mike EghtebasDatabase and Application DeveloperAuthor 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"
0
 
Carl TawnSystems and Integration DeveloperCommented:
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
 
Mike EghtebasDatabase and Application DeveloperAuthor Commented:
Does StateView remembers "Angela" was selected in Page_Load?
0
 
Carl TawnSystems and Integration DeveloperCommented:
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
 
Mike EghtebasDatabase and Application DeveloperAuthor 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
0
 
Carl TawnSystems and Integration DeveloperCommented:
>> 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
 
Mike EghtebasDatabase and Application DeveloperAuthor 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.
0
 
Carl TawnSystems and Integration DeveloperCommented:
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
 
Mike EghtebasDatabase and Application DeveloperAuthor Commented:
Thank you for your patience.
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 6
  • 6
Tackle projects and never again get stuck behind a technical roadblock.
Join Now