如何在代码后置中为DetailsView EmptyDataTemplate内的按钮绑定事件?
当然可以实现!你完全不需要依赖设计器双击按钮,也不用手动在标记里加OnClick属性,直接在代码后置里动态绑定事件就行。核心问题在于EmptyDataTemplate里的控件是模板化的,不会直接成为页面的成员变量,所以你不能直接通过ID访问,得在合适的时机去查找并绑定事件。
具体实现步骤:
给按钮设置ID(无需添加OnClick属性)
先在你的EmptyDataTemplate里给按钮指定好ID,不用额外加OnClick属性:<EmptyDataTemplate> <asp:Button ID="btnNew" Text="新建记录" runat="server" /> </EmptyDataTemplate>借助DetailsView的DataBound事件查找控件
DetailsView的DataBound事件是最佳时机——当控件完成数据绑定后触发,此时如果没有数据,EmptyDataTemplate已经被实例化,里面的按钮也已创建完成。在代码后置里添加这个事件的处理程序:protected void DetailsView1_DataBound(object sender, EventArgs e) { // 先判断当前是否处于空数据状态 if (DetailsView1.DataItemCount == 0) { // 从EmptyDataTemplate中查找目标按钮 Button btnNew = DetailsView1.FindControl("btnNew") as Button; if (btnNew != null) { // 动态绑定Click事件处理程序 btnNew.Click += btnNew_Click; } } }手动编写事件处理逻辑
最后在代码后置里写好按钮点击的业务逻辑,方法名要和上面绑定的一致:protected void btnNew_Click(object sender, EventArgs e) { // 这里写你的具体业务逻辑,比如跳转到新增页面、弹出操作提示等 // 示例: Response.Redirect("AddRecord.aspx"); }
补充说明:为什么之前直接访问按钮ID无效?
因为模板容器里的控件(比如EmptyDataTemplate内的按钮)属于模板化控件,它们不会在页面初始化阶段就被创建为页面类的成员变量,只有当对应的模板被渲染(也就是DetailsView无数据时)才会实例化。所以你不能直接在页面的其他方法里通过btnNew这个ID访问它,必须在模板实例化后的事件中用FindControl去定位。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

