完全丢失 - GridView模板中的数据绑定表达式

时间:2010-03-31 18:32:44

标签: asp.net data-binding gridview

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 还没有绑定到任何数据源?

感谢名单

1 个答案:

答案 0 :(得分:1)

我无法解释为什么页面生命周期是这样的,可能与在父对象之前渲染子元素有关。什么时候在PollBox控件中调用.DataBind()?尝试将其移动到生命周期后期的事件中,例如PreRender。

还有另一种方法可以确保它以您想要的方式工作: 订阅RowDataBound事件,使用.FindControl(“YourPollBoxID”)获取控件当前绑定行的实例,设置属性并执行manuall .DataBind();