1)在aspx页面上,我们定义了名为 gvwPolls 的GridView控件,并在其模板中定义了一个名为 pollBox1 的用户控件
<asp:GridView ID="GridView1" DataSourceID="objPolls" ...>
<Columns>
<asp:TemplateField>
<ItemTemplate>
Question is : <%# Eval("QuestionText") %> <br />
<mb:PollBox ID="PollBox1" runat="server" PollID='<%# Eval("ID") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="objPolls" ...></asp:ObjectDataSource>
a)我假设在 gvwPolls的模板中,在PollID='<%# Eval("ID") %>'
和<%# Eval("QuestionText") %>
表达式被评估之前调用 gvwPollBox1.DataBind ?
b)有人可以解释在PollID='<%# Eval("ID") %>'
和<%# Eval("QuestionText") %>
表达式被评估之前调用 gvwPollBox1.DataBind 的方式或原因是什么?
2)继续上面的例子:
- pollBox1 用户控件定义名为 rptOptions 的Repeater控件:
<asp:Repeater runat="server" ID="rptOptions">
<ItemTemplate>
<%# Eval("pollBoxTitle") %>
</ItemTemplate>
</asp:Repeater>
- 在 pollBox1的代码隐藏文件中,我们将 rptOptions 绑定到 DoBinding()方法中的数据源。
- 我们还覆盖 pollBox1的DataBind()方法:
public override void DataBind()
{
base.DataBind();
DoBinding();
}
a)我假设由于覆盖 pollBox1.DataBind(),数据绑定表达式<%# Eval("pollBoxTitle") %>
(在 rptOptions的模板中定义)将在之前得到评估调用 DoBinding 方法?如果是这样,那么在 rptOptions 实际绑定到数据源之前,是否会对<%# Eval("pollBoxTitle") %>
进行评估?
b)如果是这种情况,那么 rptOptions 如何能够从数据源中提取值(来自数据源的 pollBoxtitle属性),如果是<%# Eval("pollBoxTitle") %>
表达式得到评估, rptOptions 还没有绑定到任何数据源?
感谢名单
答案 0 :(得分:1)
我无法解释为什么页面生命周期是这样的,可能与在父对象之前渲染子元素有关。什么时候在PollBox控件中调用.DataBind()?尝试将其移动到生命周期后期的事件中,例如PreRender。
还有另一种方法可以确保它以您想要的方式工作: 订阅RowDataBound事件,使用.FindControl(“YourPollBoxID”)获取控件当前绑定行的实例,设置属性并执行manuall .DataBind();