web-dev-qa-db-ja.com

ポストバック後にユーザーコントロールのプロパティの値が失われる

これはHTMLです。ユーザーコントロールを含むリピーターがあります。

<asp:Repeater ID="rpNewHire" runat="server">
 <HeaderTemplate>
  <table>            
 </HeaderTemplate>
 <ItemTemplate>
  <tr>
     <td>
         <user:CKListByDeprtment ID = "ucCheckList" 
          DepartmentID= '<%# Eval("DepID")%>' 
          BlockTitle = '<%# Eval("DepName")%>' 
          runat = "server"></user:CKListByDeprtment>
     </td>
   </tr>
  </ItemTemplate>
  <FooterTemplate>
   </table>
  </FooterTemplate>
</asp:Repeater>

DepartmentIDは、ユーザーコントロール内で定義したプロパティです。

int departmentID;

public int DepartmentID
{
  get { return departmentID; }
  set { departmentID = value; }
}

そして、これは私がそれにアクセスしようとしている方法です

protected void Page_Load(object sender, EventArgs e)
{
   int test = departmentID;
}

ページが初めて読み込まれるとき、departmentIDに値があります。ただし、ページがポストバックする場合、その値は常にです。

18
Richard77

すべての変数(およびコントロール)は、ページのライフサイクルの最後に破棄されます。したがって、変数を永続化する方法が必要です。 ViewStateで。

public int DepartmentID
{
    get {
        if (ViewState["departmentID"] == null)
            return int.MinValue;
        else 
            return (int)ViewState["departmentID"]; 
    }
    set { ViewState["departmentID"] = value; }
}

MSDN Magazineの記事「ASP.NETアプリケーションで永続的なユーザー状態を管理するための9つのオプション」は便利ですが、MSDNWebサイトでは表示できなくなりました。 2003年4月版で、次のことができます Windowsヘルプファイル(.chm)としてダウンロード 。 (プロパティを表示し、「これはインターネットからダウンロードされました」というもののブロックを解除することを忘れないでください。そうしないと、記事を表示できません。)

23
Tim Schmelter

ビューステートを使用するようにプロパティを変更します

int departmentID = 0;
public int DepartmentID
{
  get { 
         if(ViewState["departmentID"]!=null)
         { departmentID = Int32.Parse(ViewState["departmentID"]); }; 
         return departmentID;
      }
  set { ViewState["departmentID"] = value; }
}
3
rs.