2010-08-05 69 views
1

在我的用户控件中,我使用集合填充列表框,并希望将数据保存在viewstate \ controlstate中以便进一步使用autopostback。将UserControl的数据保存到ViewState

protected void btFind_Click(object sender, EventArgs e) 
{ 
    var accounts = new AccountWrapper[2]; 
    accounts[0] = new AccountWrapper { Id = 1, Name = "1" }; 
    accounts[1] = new AccountWrapper { Id = 2, Name = "2" }; 

    lbUsers.DataSource = accounts; 
    lbUsers.DataBind(); 
    ViewState["data"] = accounts; 
} 

ListBox在按钮单击时填充。当我将帐户保存到ViewState列表框为空时,不显示集合良好。这种行为的推理是什么?

+3

Андрей,этотыминусешьпосты ?) – abatishchev 2010-08-05 11:48:06

+0

没有家伙。非常感谢。我的错误,该控件只保存其在viewstate html表示,但数据源不是,所以我应该手动(例如会话) – 2010-08-05 15:41:41

回答

2

单击按钮后,发生PostBack并且ListBox失去它的状态。

void lbUsers_DataBinding(object sender, EventArgs e) 
{ 
    if (this.IsPostBack &&) 
    { 
     AccountWrapper[] accounts = this.ViewState["data"] as AccountWrapper[]; 
     if (accounts!= null) 
     { 
      lbUsers.DataSource = accounts; 
      lbUsers.DataBind(); 
     } 
    } 
} 

(不要忘记订阅DataBinding事件标记你的ListBox)

此外,我建议您将访问封装到ViewState

private AccountWrapper[] Accounts 
{ 
    get { return this.ViewState["data"] as AccountWrapper[]; } 
    set { this.ViewState["data"] = value; 
} 
+0

为什么downvote ..? – abatishchev 2010-08-05 11:05:23

+0

我知道你的意思。我有两个,没有解释! – 2010-08-05 11:32:47