数据绑定和用户控件

时间:2009-08-12 22:29:29

标签: c# asp.net data-binding gridview objectdatasource

这真让我烦恼,所以我希望有人可以帮助我一点


1)假设页面包含用户控件,则在 UserControl.Page_Load 之前触发 Page.Page_Load


a)我假设如果Page包含 ObjectDataSource1 控件,那么 ObjectDataSource1 将在 UserControl.Page_Load 之前执行数据绑定?


b)如果是这种情况,那么 Page.Prerender 也会在 UserControl.Page_Load 之前发生吗?


c)如果 UserControl 包含 ObjectDataSource2 控件,此控件是否会与 ObjectDataSource1 (直接包含在中)执行数据绑定页的)?

  • 但这没有多大意义,因为我会假设 UserControl 中的控件遵循 UserControl的生命周期,而不是 Page的 ?!

  • 无论如何,我认为托管用户控件的网页无法接收事件或调用用户控件中包含的控件的方法?!如果是这样,那么网页如何能够在 ObjectDataSource2上调用数据绑定< / em>的?


感谢名单


编辑:

我困惑的主要原因是以下一些书的引用:

  

...用户的国家,州和城市只能从配置文件中读取一次并保存在本地变量中。 UserControl.Page_Load不能用于此,因为UserControl.ObjectDataSource完成的自动绑定发生得更早,所以我们必须使用UserControl.Page_Init事件处理程序

我假设在上面引用作者建议如果用户控件包含ODS,那么这个ODS将在UserControl.Page_Load之前执行数据绑定,这不是你所说的?

BTW - 用户控制上面提到的引用是在设计时添加到网页


另一个编辑:

我做了一些谷歌搜索,这本书(或其中的一部分)可通过以下链接获得。

http://books.google.com/books?id=hziE1NB0UkIC&printsec=frontcover&dq=website+programming+asp.net+2.0+design+solution&ei=7lmESv63Npu-ygTO0f2yDg#v=onepage&q=&f=false

无论如何,引用来自第257页,它基本上是描述 ArticleListing.ascx 用户控件的部分的一部分。

顺便说一下 - 这样你就不会认为我是妄想......我不希望任何人阅读关于该用户控件的整个部分,我只是认为第257页的代码可能会提供足够的背景来弄清楚是什么作者实际上意味着

1 个答案:

答案 0 :(得分:10)

您的所有问题都与ASP.Net页面生命周期有关。你应该从这里开始: ASP.Net Page Lifecycle Overview

然而,要回答一些具体问题。

(1)从我提供的链接:

  

Page调用OnLoad事件   页面上的方法,然后递归   为每个儿童控制做同样的事情,   每个都做同样的事情   孩子控制直到页面和所有   控件已加载。

(a)这是不正确的。 DataBinding就在PreRender之前发生。

(b)如果UserControl未添加到页面中,Page.PreRender将出现在UserControl.PageLoad ONLY 之前,直到Page的生命周期的PreRender部分为止(即动态添加)。如果是这种情况,那么用户控件的所有生命周期事件将在添加到Page的Control集合后立即连续触发,直到它赶上它的父容器,即Page。

(c)DataBinding几乎会在同一时间发生,只要此时将usercontrol添加到页面中即可。用户控件的数据绑定将在页面的控件被数据绑定后发生。

(c)项目符号点:usercontrol有自己的生命周期,为true,但同样,在将控件添加到页面上的容器之前,它不会被执行。这也应该回答你的第二个要点。


编辑:这是本书的一个有趣的摘录,我很想说它完全不正确。但是,我需要看看作者正在谈论什么样的背景。也许他正在讨论书中的一个示例对象,它在OnInit处理程序中有特殊的逻辑来进行数据绑定。

话虽这么说,我设置了一个测试项目来检查默认行为。我添加了一个ObjectDataSource,其中Select方法返回一个字符串数组,一个用户控件(.ascx)带有一个绑定到数据源的转发器,还有一个添加了用户控件的页面。事件的顺序如我所料:

MyObjectDataSource -> Init
UserControl -> Init
Page -> Init
Page -> Load
UserControl -> Load
MyObjectDataSource -> Load
Repeater1 -> DataBinding
MyObjectDataSource -> Selecting
MyObjectDataSource -> SelectMethod
Repeater1 -> DataBound

ObjectDataSource documentation也支持这一点:

  

ObjectDataSource控件检索   Select方法的数据   调用。这种方法提供   以编程方式访问该方法   由SelectMethod指定   属性。 指定的方法   由SelectMethod属性是   由控件自动调用   绑定到ObjectDataSource时   调用他们的DataBind方法。如果   你设置一个的DataSourceID属性   数据绑定控件,控件   自动绑定到的数据   数据源,根据需要。设置   DataSourceID属性是   推荐的绑定方法   ObjectDataSource控件到   数据绑定控制。或者,你   可以设置DataSource属性,但是   那么你必须明确地调用   DataBind方法的数据绑定   控制。您可以拨打选择   方法在任何时候以   检索数据。

我不得不得出结论,除非在某些特殊情况下引用该引用,否则提交人完全错了。也许他错误地写了“数据绑定”,他的意思是“从ViewState中检索以前绑定的值”?