FindControl不能与bind服务器标签一起使用,为什么?

时间:2009-04-20 17:58:00

标签: c# asp.net

我在OnLoad事件中有一个FindControl在页面上找到我的按钮,即:

protected override void OnLoad(EventArgs e)
{
    DataBind();
    control button = Page.FindControl("myButton");
}

在我的aspx页面上我有

<asp:Button runat="server" ID="myButton" />

如果我只有这个,一切正常,当我传入OnLoad时,按钮不为空,我可以执行我想要的。问题是当我在我的aspx中添加动态文本时:

<asp:Button runat="server" ID="myButton" Text='<%# "Here is my dynamic text pulled from a XML" %>' />

然后FindControl找不到任何内容,按钮为空。

在aspx上添加绑定服务器标签并不是要推迟任何事情吗?当我检查Page对象时,我在Controls集合中有一些控件,但是我找不到myButton。

对我做错了什么的想法?

修改

人们似乎认为我的代码示例是我的真实代码,但不是,所以我使用FindControl,因为我需要,因为我有嵌套控件,我不能直接访问它,我使用绑定因为我正在放置的动态文本位于ContentTemplate中,我可以在其他页面aspx中覆盖它。

我问的问题更具体的是我已经跟踪了我的FindControl返回null的问题,因为新的实现行为是绑定。

改进代码示例不是解决方案或解释如果我放一个&lt;%#%&gt;在我的aspx页面中,OnLoad事件中的FindControl返回null。

编辑2

单独的绑定标记似乎不是罪魁祸首,而是DataBind()来填充它们。无论我是否有绑定标记,在FindControl之前放置DataBind()使myButton为null。代码示例中进行了更正。

4 个答案:

答案 0 :(得分:1)

Page.FindControl()方法仅搜索与Page关联的中间控件集合。它不会递归整个控制树,所以如果你的按钮包含在另一个控件中,它将无法找到。您需要在包含控件上调用FindControl方法。

答案 1 :(得分:1)

In here MSDN说:

  

PreRender:每个数据绑定控件的   DataSourceID属性设置调用它   DataBind方法。

看起来您没有使用数据绑定控件的DataSourceID,但将FindControl代码移动到PreRender事件可能有所帮助。

答案 2 :(得分:0)

如果您想访问页面上的按钮,可以直接将按钮称为 -

this.myButton

就分配值而言,您可以在服务器代码中执行此操作 -

this.myButton.Text = "Dynamic Text";

&lt;%#xyz%&gt;仅在您对控件进行数据绑定时使用,例如在DataGrid,GridView等中

答案 3 :(得分:0)

在你的覆盖中,你不想先在你的方法中调用base.OnLoad(e)吗?