首页 新闻 会员 周边 捐助

一个UpdatePane和GridView使用时的诡异问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-11-29 00:34

最近项目中用到微软提供的UpdatePanel来做ajax,考虑其简洁性和易用性,便毫不考虑就采用此方案,可是项目遇到一个让我很是头疼的问题,场景如下:

在一个UpdatePanel有一个GridView,其中该GridView的某些列是在服务器端通过逻辑控制显示的效果,代码如下:

protected virtual void ListGridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
                {
                    if (e.Row.FindControl("DeleteButton") != null)
                    {
                        ((LinkButton)e.Row.FindControl("DeleteButton")).Attributes.Add("onclick", "javascript:return confirm('你确认要删除该条数据吗?');");

                    e.Row.Cells[e.Row.Cells.Count - 3].Text = string.Format(Constants.UIStringDisabledLinkTemp, "download", "附件不存在,不能下载!");
                    }
                }
            }
        }

在页面第一次加载的时候,其一切都正常,可是当点击GridView的排序的时候,之前格式化的附件不能下载的列,就发生了诡异变化,本来页面初始化的时候判断是不能下载,应该显示灰色的下载图片,可是点击排序后页面的图片就都变成亮色了,跟断点没有发现什么错误,可是如果把GridView从UpdatePanel中拿出来,执行上面的操作没有问题,就是在UpdatePanel中就有问题。

自己分析一下,UpdatePanel实际就是指定一个局部刷新的面板,当该面板中有任何请求服务器端的请求(其实就是_doPostBack事件),微软的ScriptManager都会截获请求,然后用ajax的方式发送到服务器端,从而实现异步刷新局部区域,当然在请求结束后页面updatepanel内的元素将会重新刷新为最新的dom元素,这就让我纳闷了,难道我的代码在服务器端没有执行,可是断点显示在服务器端的逻辑一切都正常,可是就是到客户端就发生这种莫名其妙的灾难,难道是页面的缓存?经过测试也不是,或者说页面返回的dom元素是数据在还没全部渲染后就返回的?或者说RowDataBound事件在服务器没有执行完,就返回到页面了?

总之很多的疑惑让我很费解,还请那位大侠来指点一下,不胜感激。

shen110的主页 shen110 | 初学一级 | 园豆:158
提问于:2012-07-05 22:16
< >
分享
最佳答案
0

问题终于解决,在服务器端GridViewCommand事件里,在点击EditButtong的逻辑里,最后要bindData一下,因为这样才能再一次让GridView自动调用RowDataBound事件,这样DeleteButton的状态就会正常,看来没有弄明白事件的执行顺序啊,惭愧!

shen110 | 初学一级 |园豆:158 | 2012-11-29 00:33
其他回答(3)
0

你还是对UpdatePanel不是很了解,建议你在网上看一下这个控件的用法。

收获园豆:10
悟行 | 园豆:12559 (专家六级) | 2012-07-05 22:37

感谢你的回复,的确使用这个UpdatePanel也就是在这个项目中使用,根据我的理解:

UpdatePanel其实就是微软设定一个局部更新的区域,他又很多更新方式,可以支持传统的post更新,也支持异步更新,UpDateMode等一些基础的特性都已经学习了,还有客户端的ScriptManager客户端生命周期也基本了解:begin_request, pageLoading, pageLoaded, endRequest等客户端事件,不知道这里的问题是什么原因导致的,update的基本属性都已经尝试过也研究过也没发现解决方案,还请大侠指教.

支持(0) 反对(0) shen110 | 园豆:158 (初学一级) | 2012-07-05 23:20
0

应该是没有触发RowDataBound事件,你不是给删除按钮加了确认框,你可以看看还能弹出确认框不?

收获园豆:5
psforever | 园豆:461 (菜鸟二级) | 2012-07-05 23:36

我跟断点,是执行了RowDataBound事件,并且页面的confirm弹出也能正常显示,就是本来逻辑判断下载图片应该是灰色的不能下载,但是排序事件执行后,图片的状态变成了亮色,这个很让人匪夷所思,排序代码如下:

protected virtual void ListGridView_Sorting(object sender, GridViewSortEventArgs e)         {            

string sortField = e.SortExpression;            

if (ViewState[Constants.ViewStateSortFieldKey].ToString().Equals(sortField))             {                

if (ViewState[Constants.ViewStateSortDireKey].ToString().ToUpper() == Constants.ViewStateSortDireASCKey)                    

ViewState[Constants.ViewStateSortDireKey] = Constants.ViewStateSortDireDESCKey;                

else                    

ViewState[Constants.ViewStateSortDireKey] = Constants.ViewStateSortDireASCKey;            

}            

else            

{                

ViewState[Constants.ViewStateSortFieldKey] = sortField;            

}

           

BindData();        

}

支持(0) 反对(0) shen110 | 园豆:158 (初学一级) | 2012-07-06 00:04

@shen110: 一直都没看到你在哪里怎么把控制设置不可用,代码贴出来看看。

支持(0) 反对(0) psforever | 园豆:461 (菜鸟二级) | 2012-07-06 00:14

@psfore

此段代码在前台GridView的列:

<asp:TemplateField HeaderText="考察线路" HeaderStyle-Width="80px">
                            <ItemTemplate>
                                <asp:HyperLink ID="DownLoadLink" Target="_blank" NavigateUrl='<%#Building.WebSite.WebUtilities.BuildDownloadLink(Eval("ProjectID").ToString(), Building.WebSite.DownLoadFileType.AbroadStudy.ToString()) %>'
                                    CssClass="grid-command download" runat="server"></asp:HyperLink>
                            </ItemTemplate>
                        </asp:TemplateField>

 

后台逻辑代码:

e.Row.Cells[e.Row.Cells.Count - 3].Text = string.Format(Constants.UIStringDisabledLinkTemp, "download", "附件不存在,不能下载!");

其中Constants.UIStringDisabledLinkTemp = "<a href=\"javascript:void(0);\" class=\"grid-command {0} disabled\" title=\"{1}\">command</a>";

这里按照后来逻辑构建的应该是一个disabled状态的下载图标,当然在GridView模板列中的是正常的下载图标,问题就是页面第一此加载一切正常,一旦执行页面的排序操作,界面显示就出现错误,同一个updatepanel还有asp:button,他的回送事件不会影响GridView的显示

支持(0) 反对(0) shen110 | 园豆:158 (初学一级) | 2012-07-06 00:52
0

前端样式和js的问题?猜的

收获园豆:5
codeyuyu | 园豆:224 (菜鸟二级) | 2012-07-06 14:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册