【问题标题】:Setting GridView's DataSourceId to "", causes GridView to lose将 GridView 的 DataSourceId 设置为“”,导致 GridView 丢失
【发布时间】:2009-04-15 19:18:45
【问题描述】:



如果我将 GridView 绑定到 SqlDataSource,那么第一次创建页面时,GridView 将显示从数据源检索到的列。但如果在回发时我将 GridView.DataSourceID 设置为 null 或空字符串

    protected void Page_Load(object sender, EventArgs e)
    {
             ...
        if (IsPostBack)
            GridView1.DataSourceID = "";
             ...
    }

,那么 GridView 根本不会显示任何行。但这是为什么呢?

假设 GridView 的 EnableViewstate 设置为 true,那么它应该能够显示在首次创建页面时从数据源检索到的行! 我意识到有人可能会争辩说 Framework 注意到 DataSourceId 已更改并假设 GridView 不需要来自先前数据源的数据,但我假设 Framework 会意识到空字符串或空引用不指向任何数据源,因此不会删除从先前数据源检索到的任何数据 GridView?!


谢谢


编辑:
你好,

基本上,一旦您将 DataSourceID 设置为 null 或空字符串,控件就会将此作为控件使用者的指示,即他们根本不希望绑定任何数据(甚至是 ViewState 数据) .控件在绑定之前检查 DataSourceID,如果它是一个空字符串,那么它不会在其 EnsureDataBound 方法中进行 DataBind。


因此,如果您在 Page_Load() 中将 DataSourceID 设置为 null,但 GridView 仅在绑定之前检查 DataSourceId (这发生在 Page_Load 之后很长时间),那么在检查 DataSourceId 之前,包含来自先前数据源的数据的 ViewState 在 Page_Load 中应该仍然可用() (并且仍然可用,例如,在订阅了导致回发的事件的事件处理程序中)?!

【问题讨论】:

  • 我一直在审查我的旧线程......无论如何......如果我将 DataSourceID 设置为 Null(在 Page_Load() 内),那么在回发时我仍然能够访问 GridView 中的数据(直到DataSourceID 已检查)通过 Label1.Text = GridView.Rows[].Cells[].Text;

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


【解决方案1】:

如果您将DataSourceID 设置为null 或空字符串,您的控件将不会重新绑定到ViewState 数据。我在下面链接的文章对原因有很好的解释。

基本上,一旦您将DataSourceID 设置为null 或空字符串,控件就会将此作为控件使用者的指示,即他们根本不希望绑定任何数据(甚至 ViewState 数据)。控件在绑定之前检查DataSourceID,如果它是一个空字符串,那么它不会在其EnsureDataBound 方法中使用DataBind

System.What?: DataSource VS. DataSourceID (Internals)

【讨论】:

    【解决方案2】:

    我假设 Framework 会实现 那个空字符串或空引用 不指向任何数据源 因此不会删除任何数据 从以前的数据中检索到的 GridView 来源?

    你为什么这么想,你重置了值,当然,girdview必须绑定你重置的新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2016-07-06
      • 2020-09-27
      • 2012-06-19
      • 1970-01-01
      • 2017-05-26
      • 2011-04-07
      相关资源
      最近更新 更多