【问题标题】:Populating Gridview填充网格视图
【发布时间】:2016-12-15 10:46:53
【问题描述】:

我目前正在处理asp.net webforms 项目,我有一个页面

  • asp:textbox
  • asp:DropDownList
  • asp:linkbutton

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

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

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

【问题讨论】:

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


【解决方案1】:

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

  • 查看状态
  • 控制状态
  • 隐藏字段
  • Cookie
  • 查询字符串
  • 应用程序状态
  • 会话状态
  • 配置文件属性

由于您没有提供更多信息,我建议您使用会话状态来保存数据,因为这是最简单的方法,因为信息将存储在它所属的服务器端(而不是错误地使用 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 事件的控件,您应该处理哪些回发刷新数据并在 apropiate 方法上刷新网格(页面首先加载,和添加/修改/删除行)。

如果您使用的是 .NET Framework 4.5 或更高版本,我建议您使用 GridView 模型绑定 (SelectMethod) GridView Model Binding 这样就无需在每次回发时在 Page_Load 方法中显式刷新 DataSource,这是一种更简洁的方法。

编辑:来自here

会话状态还是视图状态?

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

  • 大量数据。由于 ViewState 增加了发送到浏览器的页面的大小(HTML 有效负载)和表单的大小 回发,存储大量数据是一个糟糕的选择。

  • 尚未在 UI 中显示的安全数据。虽然 ViewState 数据经过编码并且可以选择加密,但您的数据 如果它永远不会发送给客户端,则它是最安全的。所以,会话状态是 一个更安全的选择。 (将数据存储在数据库中更 由于额外的数据库凭据而安全。您可以为 更好的链接安全性。)但是如果您显示了私人数据 在 UI 中,大概您已经对 链接本身。在这种情况下,放置相同的内容同样安全 ViewState 的值也是如此。

  • 不容易序列化为 ViewState 的对象,例如 DataSet。 ViewState 序列化程序针对一小组 常见的对象类型,如下所列。其他可序列化的类型 可能会在 ViewState 中持久化,但速度较慢并生成一个非常 大型 ViewState 占用空间。

【讨论】:

  • Mr.DiegoS,如果我需要将数据保存在页面级别,您会推荐什么状态管理,为什么?
  • 这取决于数据,我倾向于说你应该使用 Session(这是大多数情况下的答案),但在某些情况下你可以使用隐藏字段(如果数据量很小)甚至是数据库。
  • 数据将是 .. 假设一个 10 列最多 50 行的网格。
  • 在这种情况下,使用 SessionState 或 ViewState 两者几乎相同。阅读msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx,了解如何在 ViewState 中存储数据
  • @ZEZOmaster 我添加了关于何时使用视图状态和何时使用会话的简要说明!
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多