2016-10-30 15 views
0

現在、Textboxの以前の値を保存し、ontextchangedの新しい値と比較しようとしています。しかし、今問題は、私が比較のために以前の値を格納しようとするたびに、値はnullです。以前の値を保存して新しい値と照合します

以前の値を保存する方法はありますか?

これは私が試したコードです。 tbDescと仮定Hello Worldの古い値を持っている、と私はASP.NET WebフォームでHello

ASPX

public string oldvalue = ""; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    oldvalue = tbDesc.Text; 
} 

protected void tbDesc_TextChanged(object sender, EventArgs e) 
{ 
    string newvalue = tbDesc.Text; 

     if (newvalue != oldvalue) 
     { 
     tbDesc.BackColor = Color.Yellow; 
     } 
     else 
     { 
     tbDesc.BackColor = Color.White; 
    } 
} 
+0

ページロードでのみ古い値を設定しているためです。 TextChangedイベントの最後に古い値を設定する必要があります。 OnBlurイベントを使用して、テキストボックスフォーカスが削除されたときにのみ古い値が設定されるようにします。 –

+0

さらに良い方法があります。タイマーを使用する。ユーザーが3秒後に入力を停止したときに古い値を設定します。 –

+0

@ M.kazemAkhgary問題は、ページの読み込み時に、私は古い値を設定しますが、textchangedイベントでは古い値はnullです。 – Arane

答えて

0

でテキストボックスを編集し、ページクラスの新しいインスタンスを要求ごとに作成されます。これが、クラス内のフィールドを使ったアプローチがうまくいかない理由です。フィールドは毎回初期化され、クラスが作成されます。静的フィールドは、すべてのユーザー間でその内容が共有されているため、これを解決できません。

さらに、リクエストごとにPage_Loadの値をリセットします。したがって、このコードは削除する必要があります。

これを解決するには、stateをページに追加する必要があります。スコープはページレベルなので、古い値をViewStateに保存できます。この方法では、古い値がクライアントに転送され、ポストバックでサーバーに返されます。

このlinkはViewStateの概要を示します。

private string OldValue 
{ 
    get 
    { 
     var viewStateVal = ViewState["OldValue"] as string; 
     if (viewStateVal == null) 
      return string.Empty; 
     return viewStateVal; 
    } 
    set 
    { 
     ViewState["OldValue"] = value; 
    } 
} 

protected void tbDesc_TextChanged(object sender, EventArgs e) 
{ 
    string newvalue = tbDesc.Text; 
    if (newvalue != OldValue) 
    { 
     tbDesc.BackColor = Color.Yellow; 
     OldValue = newvalue; 
    } 
    else 
     tbDesc.BackColor = Color.White; 
} 

をいくつかのケースでは、ViewStateは無効にされる可能性があります(例えば、いくつかの帯域幅を節約するために、ページのサイズを小さくする):

次のサンプル

では、リクエスト間で値を格納するためにViewStateを使用する方法を示します。この場合、Cookieを使用する方法があります。

関連する問題