解决 A control with ID 'X' could not be
1、首先根据字面的意思是:触发器找不到ID 为XX的控件。
但是我的控件ID明明就在那里放着。
这有发生的情况可能如下:
(注意:也就是解释为什么找不到)
首先如果 这个控件ID 不作为 GridView等一些数据控件内的模板项目时候,不会出现这有的错误。
但是 当如下图所示的情况:
UploadButton作为GridView中的Itemtemple 模板中的项时,此时这个UploadButton是直接获取不到的。你可以在cs文件中 直接打UploadButton试试,是不会出现智能提示的,也是没有这个对象的。

2、因为作为一个条目的模板。UploadControl 这个ID 会是变化的。可以在网页的源代码中查看。
如下图:

3、那么如何解决这个问题:
如果想绑定一个
<Triggers>
<asp:AsyncPostBackTrigger />
</Triggers>
那么可以采用代码绑定的方式。
比如在GridView加载完数据后进行绑定。
比如
遍历每个GridViewRow 然后查找ID 为
r.FindControl("UploadButton")
然后给他进行注册。
GridViewRowCollection coll = GridView1.Rows;
ScriptManager sm = Master.FindControl("ScriptManager1") as ScriptManager;
foreach (GridViewRow r in coll)
{
// sm.RegisterPostBackControl(r.FindControl("UploadButton"));
sm.RegisterAsyncPostBackControl(r.FindControl("UploadButton"));
}
其中:RegisterAsyncPostBackControl 是真正的异步方式。
而 :RegisterPostBackControl 还是全页回发。
上面2个方法分别对应:trigger中的
<Triggers>
<asp:AsyncPostBackTrigger />
<asp:PostBackTrigger />
</Triggers>
4、其实。如果真正采用这有的方式还不如采用:
绑定:CommandName、CommandArgument
的方式进行操作。如图所示“
<asp:Button id="UploadButton"
Text="更新当前时间"
runat="server" CommandName="UpdateTime" CommandArgument="<%Bind(CurTime) %>">
</asp:Button>
可以在GriView中的RowCommand 事件中进行处理。

5、处理事件:
如图所示:
