问题描述
我的aspx页面中有个GridView控件,其中有一个[删除]列:<asp:CommandFieldDeleteText="<divid="de"onclick="JavaScript:returnconfirm('确定删除吗?');>【删除】</div>"ShowDeleteButton="True"><ItemStyleForeColor="Red"Width="30px"/></asp:CommandField>在GridView控件的OnRowDataBound事件中根据条件,如果所在行不允许删除,则【删除】文本修改为空,以避免出发删除操作:if(e.Row.RowType==DataControlRowType.DataRow){//强制修改【删除】列的文本if(当前行不允许删除)e.Row.Cells[1].Text="";}同时,页面中还有一个Timer控件,每5秒触发一次,结果第一次显示页面时结果正常,不允许删除的行[删除]列都为空,一旦Timer定时到期,原先为空的[删除]列又重新显示为【删除】,即便Timer控件中不执行任何代码时也是如此,请问有办法解决这个问题吗?
解决方案
解决方案二:
这个可能是因为Timer刷新了页面但没有OnRowDataBound,所以都显示出来了
解决方案三:
是这样的,Timer刷新并没有激活OnRowDataBound,导致显示内容被刷新成原始内容,也没有办法避免呢?
解决方案四:
有人遇到这样的问题吗?
解决方案五:
禁用ViewState看看行不行?
解决方案六:
禁用ViewState后Grid内容会在定时到期后被清空
解决方案七:
没有办法。因为你的代码的逻辑本身就是如此的。asp.net本来就是”一遍遍刷新html”的机制,它并不是像服客户端应用那样在一个页面上不刷新的。你用Timer,这当然就是为了刷新页面,丢弃一切未提交刷新过的客户端操作数据。从基本原理上,你的程序就是这个结果。要解决它,从基本原理上入手,放弃你的选择,学习真正做到无刷新(asp.net绝不处理UI)的编程知识。或者,放弃你的业务交互设计。要知道asp.net的机制决定了它的硬伤,无法解决。
解决方案八:
如果你的Timer在一个UpdatePanel内,并且这个UpdatePanel与GridView无关(UpdatePanel并不包含数据编辑行),那么UpdatePanel局部刷新时是可以部分地解决这类问题。但是,这要求你的Timer与GridView中任何东西都没有关系,否则只要是你去刷新GridView就会丢失用户编辑数据。而且UpdatePanel其实会在服务器端一遍遍地重建整个页面对象,执行所有事件,最后只是更新Timer所在的一点点html,这是很“重”的程序。不但你不能更新GridView中任何东西,而且用户操作时会同时感觉卡。
解决方案九:
如果你只有你贴出的这一点点代码,实际上你的代码if(e.Row.RowType==DataControlRowType.DataRow){//强制修改【删除】列的文本if(当前行不允许删除)e.Row.Cells[1].Text="";}这里是不对的,应该为你的设计代码<asp:CommandFieldDeleteText="<div......绑定Visible属性,例如<asp:CommandFieldVisible='<%#CheckVisible(Container.DataItem)%>'DeleteText="<div并且自己实现CheckVisible函数来判断。而你的那种e.Row.Cells[1].Text="";代码根本不能保持状态。但是,这只是在你的程序很初级的情况下才可以!因为你是用的是Timer,是个非常任性的东西,它破坏的绝非简单的状态,还有用户操作。用户操作编辑到GridView某一行到一半,突然就被刷新了,这种事情放到任何人那里都无法接受。因此只要Timer会造成GridView任何一行刷新,这就是逻辑设计错误的。如果你这问题认为是“去让删除按钮去再次显示对的状态”,那么其实从原理上就错了。这就是捡了芝麻丢了西瓜,制造出了更大的麻烦。
解决方案十:
sp1234说的很有道理,学习了,非常感谢!Timer的确很任性,但为了让用户不用主动刷新列表,也只好这么处理了,好在页面没有其它交互操作,否则肯定难以忍受,设置visible属性倒是可以实现,但列就错位了,在不允许删除的行中,删除按钮列会消失,后续列会前移;我试过也可以使用enabled属性,但缺点就是[删除]列都显示一样的内容,无法直观判断哪行不允许删除
解决方案十一:
OK,问题解决,在OnRowDataBound事件中设置Cell的Enabled和ForeColor属性可以不受Timer的影响