我在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。代码示例中进行了更正。
答案 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)吗?