2010-12-04 6 views
3

私はサイトからサンプルコードを受け取りました。私はちょうどViewStateにどのように値が追加されたかについては分かりません。C#のプロパティに関する混乱

コード私はいくつかの値が辞書のコレクションで、全体のコレクションは、「名前」という名前のViewStateに追加されたことを後に追加されたことを理解し、ページの読み込みイベントに

private Dictionary<Guid, string> Names 
{ 
    get { return (Dictionary<Guid, string>)ViewState["Names"]; } 
    set { ViewState["Names"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     // to keep this sample really simple, we will populate some 
     // sample data in a Dictionary and store in the viewstate 
     var names = new Dictionary<Guid, string> 
     { 
      { Guid.NewGuid(), "John" }, 
      { Guid.NewGuid(), "Smith" }, 
      { Guid.NewGuid(), "Arther" }, 
      { Guid.NewGuid(), "Hari" } 
     }; 
     //store the list in the viewstate. 
     ViewState.Add("Names", names); 

     //init grid   
    } 
} 

protected void btnAddSave_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     Names.Add(Guid.NewGuid(), txtNewName.Text);    
    } 
} 

を次のように。 btnAddSave_Clickイベントで

コードNames.Add(Guid.NewGuid(), txtNewName.Text);は、コレクションに再び名前を追加します。私はどれだけ新しい値はビューステートに追加されていることを理解していない

が、1つの事。

誰かが新しい値がViewStateに追加されるので、どのように自動的にセッターがありませんありprivate Dictionary<Guid, string> Namesプロパティを見れば。私は私の質問がはっきりしていることを望む簡単な言葉では、私はちょうどそこにはsetterがないことを知りたいですが、コードがNames.Add(Guid.NewGuid(), txtNewName.Text);のようになったら、ViewStateに新しい値がどのように追加されたかを知りたいだけです。 ViewStateに追加されたか、新しい値を自動的

。新しい値がディクショナリコレクションに追加されていますが、ディクショナリコレクションに値を追加した後にすべてのディクショナリ値がViewStateに追加されたコードはありません.iコードを実行すると、このコードは非常にあいまいになります。辞書コレクションに新しい値が追加されたときに、ViewStateで新しい値がどのように追加されるかを理解してください。ありがとう!

答えて

2
あなたは

1-関与するステップが入っている名前が表すプロパティのバッキングストアを取得し、次の

Names.Add(Guid.NewGuid(), txtNewName.Text);    

にアクセスした場合、それは

可能である理由のViewStateの

内部実装が辞書のthatsですあなたのケースはViewState ["Names"]です。

は、プロパティ名のゲッター一部を参照してください

private Dictionary<Guid, string> Names 
{ 
**get { 
     return (Dictionary<Guid, string>)ViewState["Names"]; 
    }** 
set { ViewState["Names"] = value; }} 

編集、トーマスのコメントについては、私は

はあなたを逆参照今セッター、その唯一のゲッター、忘れる私の応答を追加してい名前readonlyプロパティ、逆参照の背後にある実際のタイプはstatebagでstatebagはIDictionaryを実装しています。そのため、ViewStateプロパティをDictionaryにキャストできます。DictionaryのAddメソッドを呼び出すと、既知のStateBagに格納されます。 ■コントロールのViewState。 ので、ViewStateは単にコントロールのプロパティであり、それはViewStateに追加されますどのようなタイプ

+0

どのように動作していますか。サンプルコードを使って詳細を記入してください。ありがとう – Thomas

+0

私はコードを与えて1つの間違いをした。コードはプライベートです。Dictionary 名前{get {return(Dictionary ))ViewState ["Names"]; }}実際には何も設定されていなかったので、Names.Add(Guid.NewGuid()、txtNewName.Text);このコードは、新しい値がviewstateにどのように追加されたかを実行しました。 viewstate property.plzzに存在しないため、expail – Thomas

+0

Setter、その唯一のゲッターを忘れてしまいます。名前のreadonlyプロパティを参照すると、逆参照の背後にある実際のタイプはViewStateで、statebagをinturnし、statebagはIDictionaryを実装しています。 ViewStateをDictionaryにキャストします。DictionaryのAddメソッドを呼び出すと、既知のControlのViewStateであるStateBagに格納されます。 – TalentTuner

0

ではないことは、辞書の内容ではなく、辞書への参照。その後でも辞書に含まれる内容を変更できます。

ページの実行が完了すると、それがブラウザに送信されようとしていた場合、辞書の内容をシリアル化されます。それまでは辞書を変更することができ、変更はViewStateで終了します。

+0

私はコードを与えるのに間違いを犯しました。コードはプライベートです。Dictionary 名前{get {return(Dictionary ))ViewState ["Names"]; }}実際には何も設定されていなかったので、Names.Add(Guid.NewGuid()、txtNewName.Text);このコードは、新しい値がviewstateにどのように追加されたかを実行しました。プレースステートが存在しないので、viewstateを使用してください。 – Thomas

+0

@Thomas:辞書の内容を変更するためにセッターは必要ありません。そのプロパティの設定者は、辞書を完全に新しい辞書に置き換えるためにのみ使用されます。ゲッターを使用して、辞書の参照を取得し、それにアイテムを追加することができます。 – Guffa

0

名での値。追加は(直接)ビューステートに追加されません。既にビューステートにあるコレクションに追加されます。その結果、コレクションがシリアライズされると、名前に追加された値がシリアル化されます。これは、参照型(Dictionaryである)を理解するためのものです。

+0

私はコードを与えるのに間違いを犯しました。コードはプライベートです。Dictionary 名前{get {return(Dictionary ))ViewState ["Names"]; }} 実際にはセッターがなかったので、Names.Add(Guid.NewGuid()、txtNewName.Text);このコードでは、viewstateに新しい値を追加する方法を実行しました。 viewstateではproperty.plzz expainにsetterが存在しないためです。 – Thomas

+0

テキストフィールドの値は、すでにViewStateコレクションにある辞書に追加されます。 ViewStateにコードNames.Add(key、value)によって新しいものは何も追加されません(明示的に) –