填充Gridview

时间:2016-12-15 10:46:53

标签: c# asp.net .net gridview webforms

我目前正致力于asp.net webforms项目,我有一个

页面
  • asp:textbox
  • asp:DropDownList
  • asp:linkbutton

我在同一页面上也有asp:gridview,每当我点击linkbutton 而不将数据保存到DataBase时,我需要在其上插入新行即可。 我过去实现这一目标的方法是将数据保存在ViewState列表中。

所以,我的问题是:难道没有更好的方法吗? 如果是,请详细说明。

更新:PostBack发生时,我不得丢失gridview数据。

1 个答案:

答案 0 :(得分:1)

您正在寻找ASP .NET State Management,有几种方法可以处理它:

  • 查看状态
  • 控制状态
  • 隐藏的字段
  • 缓存
  • 查询字符串
  • 申请状态
  • 会话状态
  • 个人资料属性

由于您没有提供更多信息,我建议您使用会话状态来保存数据,因为这是最简单的方法,因为信息将存储在它所属的服务器端(而不是错误地使用ViewState,其中信息两次到客户端,一个在de GridView.DataBind()中,另一个在ViewState中)。你需要做这样的事情:

MyGridView.Datasource = (List<Object>)Session["myGridViewData"];
MyGridView.DataBind();    

无论何时插入/删除/修改新行,都必须更新myGridViewData会话变量中的数据集。

请记住在每次回发时刷新GridView.DataSource,这样你就不会丢失信息:

protected void Page_Load(object sender, EventArgs e)
{
  grid1.DataSource = getDataSet();
  grid1.DataBind();      
}

private List<Object> getDataSet()
{
    if (Session["myGridViewData"] == null)
        Session["myGridViewData"] = new List<employee>();            

    return (List<Object>)Session["myGridViewData"];
}

protected void addNewRowButton_Click(object sender, EventArgs e)
{
    List<Object> list = (List<Object>)Session["myGridViewData"];       
    list.Add(new Object ());
    Session["myGridViewData"] = list;
}

请记住这不是一个好习惯来更新Page_Load事件的控件,您应该处理哪些回发刷新数据并刷新网格上的方法(页面首次加载,并添加/修改/删除行。)

如果您使用的是.NET Framework 4.5或更高版本,我建议您使用GridView模型绑定(SelectMethod) GridView Model Binding这不是必须在Page_Load方法中明确地刷新每个回发上的DataSource,这是一种更简洁的方法。

编辑:来自here

  

会话状态或ViewState?

     

在某些情况下,在ViewState中保存状态值是   不是最好的选择。最常用的替代方案是Session   状态,通常更适合:

     
      
  • 大量数据。由于ViewState增加了发送到浏览器的页面(HTML有效负载)和表单大小   回过头来看,它是存储大量数据的不良选择。

  •   
  • 保护UI中尚未显示的数据。虽然ViewState数据是经过编码的,但可以选择加密您的数据   如果从未发送给客户端,则最安全。所以,Session状态是   一个更安全的选择。 (将数据存储在数据库中甚至更多   由于其他数据库凭据而安全。您可以为其添加SSL   更好的链接安全性。)但是如果你已经显示了私人数据   在用户界面中,大概你已经对安全性感到满意了   链接本身。在这种情况下,放置它也同样安全   也可以将值转换为ViewState。

  •   
  • 对象不容易序列化为ViewState,例如DataSet。 ViewState序列化器针对一小部分进行了优化   常见对象类型,如下所示。其他可序列化的类型   可以在ViewState中持久化,但速度较慢并生成一个   大ViewState足迹。

  •   
相关问题