9

私は ASP.NET/C# Web サイトに取り組んでいます。

データベースからデータを読み取り、辞書に保存しています

Dictionary<string, decimal> Results

そしてそれを ASP.NET チャートにバインドします

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

ボタンをクリックしたときにポイントのラベルを変更したい。

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

しかし、ボタンをクリックすると問題が発生し、ポストバックが発生し、「結果」辞書に保存されたデータとチャートが失われます。

ポストバックが発生したときに、データベースからもう一度読み取る必要なく、データを失わないようにする方法はありますか?

助けてくれてありがとう。

4

6 に答える 6

10

はいViewStateを使用して、ポストバック間でデータを保持します。

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

注: viewstate の Null 値を確認してください。それ以外の場合は、例外またはエラーがスローされます。

于 2011-09-12T13:13:29.437 に答える
4

一部のレスポンダーは、データをViewStateに保存することを提案しています。これはASP.NETのカスタムですが、パフォーマンスを実際に損なう可能性があるため、そのルートをたどりたい場合は、その影響を完全に理解する必要があります。この目的のために、ViewStateを本当に理解していることを読むことをお勧めします。

通常、データベースから取得したデータセットをViewStateに保存すると、パフォーマンスが大幅に低下します。あなたの状況の詳細を知らなければ、私はあなたがすべての要求でデータベースからデータをロードする方が良いと推測するのは危険です。基本的に、a)データをシリアル化してクライアント(低速接続の可能性がある)にデータを送信するか、b)データベースからデータを取得するオプションがあります。これはデータ取得と巧妙なキャッシュ用に最適化されています。

于 2011-09-12T13:22:34.630 に答える
3

データを入れたり、「反対側で」引き出しViewStateたりすることができます。Session

于 2011-09-12T13:12:53.767 に答える
1

ViewState を使用してクライアントとの間でこのデータをやり取りするよりも優れた解決策は、それぞれがやり取りされるクライアント ID を作成し、この ID をキーとしてサーバー側にこのデータのキャッシュを保持することです。そうすれば、このデータをクライアントからサーバーに毎回送信する必要はなく、その逆だけです。

これはまだ私には間違っているように思えますが、データのやり取りによるオーバーヘッドが非常に大きくなる他のいくつかの回答よりも優れたソリューションです。

実際、あなたは表示情報を変更しているだけであり、あなたの質問から、あなたが実際にこのデータを何らかの方法で処理しているとは思わないので、これは実際にはあなたのASP.NET ページ。私はこれをやったことがありませんが、いくつかの基本的なグーグルはこれに関するいくつかの記事を見つけました.

于 2011-09-12T13:20:11.957 に答える
0

ViewState を使用する代わりに、ディクショナリに値を割り当てるためのコードを関数に移動し、ポストバックごとに page_load からその関数を呼び出さないでください。これにより、チャートからデータが失われることはありません。

于 2012-10-12T21:42:31.850 に答える