gridview外加了个update panel ,导致自定义模板里的编辑按钮无法同步回发,于是乎写了一个事件,但事件只能保证按钮在第一次单击时是同步回发,第二次就不行了。求解决方案?
protected void gvList_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { 。。。 var lnkAddSub = e.Row.FindControl("lnkAddSub") as LinkButton ; if (lnkAddSub != null) { ScriptManager1.RegisterPostBackControl(lnkAddSub); } 。。。 } } protected void gvList_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "AddSub") { return; } }
黄天不负苦心人啊,我解决了,倒也不是完全依赖网络。这篇帖子给了我一些提示:
http://www.codeproject.com/Messages/2483369/Doing-a-sync-normal-postback-from-and-gridview-ins.aspx
贴子中有一个标题:Doing a sync(normal) postback from and gridview inside an ajax updatepanel
里面谈到在gridview内部再嵌入一个update panel ,嵌入的位置是使要同步回发的控件的ID可以被访问的模板内,然后做类似的设置:
<asp:UpdatePanel ID="UpdatePanel2" runat="server"> <Triggers> <asp:PostBackTrigger ControlID="lnkAddSub" /> <asp:PostBackTrigger ControlID="lnkEdit" /> </Triggers> <ContentTemplate> </ContentTemplate> </asp:UpdatePanel>
就可以完成同步回发了。注意不要往ContentTemplate里写绑定数据哦,只要把控件ID设置成同步回发就可以了,否则像 CommandArgument='<%#Container.DataItemIndex %>'这样绑定就错了,因为放进去Container就变了嘛,我刚才还纠结了一小会儿呢。
呵呵,谢谢你给的园豆,也没帮上你忙,有问题大家互相研究哈
没有Id是做不到的,除非你有ID之外的其他唯一标识
兄弟,别那么绝对,最起码,我可以在page_load事件里对gridview按行find控件每次执行
ScriptManager1.RegisterPostBackControl(lnkAddSub);
只是觉得这种方法使程序的结构看起来不太合理,太外行了。我只是想知道有没有正规的微软推荐的做法。
不知道你想做什么,既然加了updatePanel不就是想局部刷新吗?但你写的看不懂
里面大多数的命令按钮我是希望异步的,但有一个编辑按钮,这需要跳转到编辑视图,编辑视图是在别外一个detailview里的,detailsview不在updatepanel里,所以单击后跳转不了。
第一次执行完之后,重新绑定一次数据试试
此法暂不可行,页面逻辑比较复杂,有三级三层gridview嵌套
@沧海一杰: 那你获取到控件的ClientID,后台进行注册。把事件再绑定回来。
用JS去绑定也行。