Y2theZ
Y2theZ

Reputation: 10412

How to keep data through postbacks?

I am working on a ASP.NET/C# Website.

I am reading data from a database, saving it in a Dictionary

Dictionary<string, decimal> Results

and then binding it to a ASP.NET chart

PieChart.Series["Series"].Points.DataBind(Results, "Key", "Value", string.Empty);  

I want to change the Label of a Point when I click a button.

protected void Button_Click(object sender, EventArgs e)
{
    PieChart.Series["Series"].Points[0].Label = "abc"
}

But the problem when I click the button, a PostBack happens and the data saved in The "Results" Dictionnary is lost as well as the Chart.

Is there a way to , not lose the data when a postback happens without having to read from the database all over again?

Thank you for any help.

Upvotes: 9

Views: 23809

Answers (6)

Steve Hibbert
Steve Hibbert

Reputation: 2175

I often use asp:HiddenField to store small amounts of non-secure data on the client side.

In the Page_Load() function you can set the hidden field value, and then you can read it back in functions that get called later.

Do not use this for secure data as the client user can do a View Source to see the data in the page if they wish.

Upvotes: 0

Ratan
Ratan

Reputation: 883

Instead of using ViewState, why dont you move your code for assigning value to the dictionary to a function and then call that function from page_load on every postback. This way you will not lose data from your chart.

Upvotes: 0

Rune
Rune

Reputation: 8380

Some responders have suggested storing the data in ViewState. While this is custom in ASP.NET you need to make sure that you absolutely understand the implications if you want to go down that route, as it can really hurt performance. To this end I would recommend reading TRULY understanding ViewState.

Usually, storing datasets retrieved from the database in ViewState really hurts performance. Without knowing the details of your situation I would hazard a guess that you are better off just loading the data from the database on every request. Essentially, you have the option of a) serializing the data and sending the data to the client (who could be on a slow connection) or b) retrieving the data from the database, which is optimized for data retrieval and clever caching.

Upvotes: 4

Kevek
Kevek

Reputation: 2554

A better solution than using the ViewState and passing this data back and forth from the client may be to create a client id that each is passed back and forth and keep a cache of this data on the server side, keyed by this id. That way you do not need to send this data from client to server each time, only the other way around.

This still sounds wrong to me, but it is a better solution than some of the other answers that would involve so much overhead due to the data back-and-forth.

In fact since you're only changing display information and, from your question, I don't believe you're actually processing this data in any way, it seems to me that this is really a job for some sort of javascript alongside of your ASP.NET page. I have never done this, but some basic googling did turn up some articles about this.

Upvotes: 1

Pranay Rana
Pranay Rana

Reputation: 176956

Yes Make use of ViewState to preserve data between postback.

public Dictionary<string, decimal> Results
{ 
  get { return ViewState["Results"]; }
  set { ViewState["Results"] = value; }
}

Note: Check for the Null value of viewstate otherwise it will throw an Exception or Error

Upvotes: 10

cjk
cjk

Reputation: 46475

You can put the data in ViewState or Session to then be able to pull it out "on the other side".

Upvotes: 3

Related Questions