我创建了一个应用程序,它在启动时从数据库中抓取笑话并在屏幕上显示第一个笑话。现在,当我们点击Next按钮时,它应显示第二个笑话。当我第一次抓住笑话时,我把它们放在一个全局声明的数据表中。为了表明我正在做的第一个笑话:
Title.Value = dt.Rows[0]["joke_title"].ToString();
Detail.Value = dt.Rows[0]["joke_content"].ToString();
现在当我按下Next按钮时,我正在运行这些命令:
Title.Value = dt.Rows[0+1]["joke_title"].ToString();
Detail.Value = dt.Rows[0+1]["joke_content"].ToString();
但是当点击“下一步”按钮时,页面会回发并丢失数据表中的值。如何在不丢失数据表中的数据的情况下解决错误?
答案 0 :(得分:3)
i put them in a globally declared datatable
此数据表在哪里声明?在你的页面类中?你能告诉我们这段代码吗? 如果它在您的页面类中,则不会在回发中保留。为每个请求重新创建页面类,它不会保留任何状态。
如果要在回发之间维护状态,则必须使用状态管理机制(如Viewstate / Session)才能维护数据表的旧值。
答案 1 :(得分:1)
在呈现页面时,将处理在该页面的类中创建的所有对象。现在发生回发时,数据表不会包含任何数据。要在回发中保留数据,您需要将其存储在某个地方(如InSane所说)。如果数据表包含很少的行,那么最好的方法是使用Session对象。
从数据库中检索行后,将数据表存储到会话中:
Session["myTable"] = dt;
在PageLoad事件处理程序的开头,检查它是否为回发,然后再次从会话中读取数据表:
if(this.IsPostBack == true)
{
DataTable dt = (DataTable)Session["myTable"];
}
else
{
// fetch the records from database
}
请注意,数据表不会在会话中可用。
答案 2 :(得分:0)
您也可以使用静态数据表解决此问题。但是,数据表将在所有线程中保持静态。