【问题标题】:Why is the DataBind() method necessary?为什么需要 DataBind() 方法?
【发布时间】:2010-11-02 07:25:11
【问题描述】:

简单的问题,我猜。

很长一段时间以来,在以编程方式对我的 ASP.NET 控件进行数据绑定时,我一直盲目地遵循一种(假定的)常见模式。即:

gridView1.DataSource = someList;
gridView1.DataBind();

但是,如果我将 GridView 设置为通过 DataSourceID 属性绑定到 DataSource 控件,则无需调用 DataBind()。即:

gridView1.DataSourceID = LinqDataSource1;

足够了。

此外,如果您尝试在 ASPX 标记中设置 DataSource 属性,您会看到以下内容:

您不能以声明方式设置 DataSource 属性。

我认为这些是相关的,但我仍然对为什么需要 DataBind() 感到困惑。 DataSource 和 DataSourceID 之间的区别是次要的 - 我可以理解那里发生的一些魔术。真正的问题是为什么 DataSource 属性设置器不自动导致数据绑定? 有没有我们想要设置 DataSource 但不绑定到它的场景?

【问题讨论】:

    标签: asp.net data-binding


    【解决方案1】:

    在 ASP.Net 中,在页面生命周期的特定时间点(而不是之前)让特定数据可用并准备好通常很重要。例如,您可能需要尽早绑定到下拉列表,以便稍后在该列表上设置选定的索引。或者您可能需要稍等片刻来绑定那个大网格,以减少您保持该连接处于活动状态/将数据保留在内存中的时间。

    让您显式调用.DataBind() 方法可以支持两端的场景。

    【讨论】:

    • 您能解释一下后来的绑定是如何缩短将数据保存在内存中的时间吗?我假设一个简单的 Collection 保存在内存中(如上所述,如果 someList 是 List)没有区别,但它如何处理更复杂的事情?是否有延迟评估?一个很好的例子。
    • 考虑使用数据读取器作为源。如果您立即绑定,您将遍历阅读器并将这些内容保存在内存中。如果您在页面生命周期的后期等待,您可以在更短的时间内等待。
    • 谢谢你的解释,但是我不明白reduce the amount of time you hold that connection active是怎么回事?仅当从 OnDataBinding 事件调用 ExecuteSelect() 时,连接才打开。当 ExecuteSelect() 完成时,它会调用 dbConnection.Close(); 并且连接不再处于活动状态。我错过了什么吗?
    • 简单的控件没有区别。但是一些控件——尤其是某些第三方工具包——被设计为将数据直接流式传输到响应流中,因此一次只有一条记录在网络服务器的内存中。这对于性能和规模来说很棒,但是提前绑定它们会打开一个连接,直到 ASP.Net 生命周期的最终渲染阶段才会关闭。
    【解决方案2】:

    DataSource 是 BaseDataBoundControl 类的属性。 DataSourceID 是 DataBoundControl 类的一个属性,继承自 BaseDataBoundControl,在 ASP.NET 2.0 之前不存在。

    由于 DataBoundControl 明确用于以列表或表格形式显示数据,而 BaseDataBoundControl 无法做出这种假设,因此在设置 DataSource 时绑定不会自动进行,因为控件的类型可能与数据结构不匹配。

    当然,这只是基于 MSDN 文档的猜测,所以我可能是错的。

    【讨论】:

      【解决方案3】:

      我注意到,如果不使用 DataBind(),我的 GridView 中将不会显示任何内容,因此我总是将其包含在这部分代码中:

      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      
          ' TableAdapter object.
          ' Provide communication between this application and the database.
          '-----------------------------------------------------------------
          Dim suppliersAdapter As New SuppliersTableAdapter
      
          ' Get the data from the TableAdapter into the GridView.
          '------------------------------------------------------
          GridView1.DataSource = suppliersAdapter.GetSuppliers()
      
          ' Display the result set from the TableAdapter in the GridView.
          '--------------------------------------------------------------
          GridView1.DataBind()
      End Sub
      

      请原谅额外的评论,因为我还在学习 ASP.Net,并且 cmets 将帮助我更好地学习“什么和为什么”来使用某些语句。

      【讨论】:

        【解决方案4】:

        试试这个:

        if (GridView1.EditIndex == e.Row.RowIndex)
        {              
            TextBox t2 = (TextBox)e.Row.FindControl("TextBox2");
            DateTime dt2;
            if (DateTime.TryParse(t2.Text, out dt2))
            {
                t2.Text = dt2.ToString("yyyy-MM-dd");
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-02
          • 2014-02-28
          • 2014-07-24
          相关资源
          最近更新 更多