记录一下今天解决的一个需求,GridView在页面上用SqlDataSource控件配置数据源直接绑定,不用后台代码动态绑定,然后为了方便插入数据,在参考了各位大佬的博文后,采用了在字段的脚注行里插入文本框控件,收集各列的数据,然后在后台用SqlDataSource的插入参数配置之后,直接insert方法完成新记录的入库。
理想是美好的,但现实总是有点扭曲。这个新记录插入方法在数据源有数据的时候很好使,因为只要设置了showfooter=true,脚注行就能显示。但是如果没数据的时候,脚注行就消失了,这简直就是反人类啊,明明没数据才是最需要你出现的时候,但你偏偏消失了。而且表头有个ShowHeaderWhenEmpty属性可以解决无数据显示表头的问题,偏偏没有对应的showFooterWhenEmpty来解决无数据显示脚注行的需求。
于是又参观了几个大牛的相关问题的博文,发现他们要么是动态绑定数据源,监测数据条数为0就自动插入一个空白新行,把无数据变成有数据,以此来解决需求。但本着能偷懒就不写后台代码的原则,这个方法就没法套用了。另外还有一个方法也有点类似,但是能保持数据源还是aspx页面里配置的,有点偷梁换柱意思,就是在PreRender里检查是否有数据,没有数据就用一个同样列框架的DataTable插入一个空行并替换掉SqlDataSource,最终使GridView变成有数据;但这个替换还要有个还原的操作,在Page_Load里,每次都要把SqlDataSource设置回来,不然数据源就不统一了。这个方法的确也能解决问题,但设置太复杂。
因为实在没有更好地偷懒的方法了,所以自己研究了一下,思路都差不多,要想让Footer模板显示,唯一的方式就是在SqlDataSource无数据时,能够插入一个空行,这就变成有数据了,自然就能显示Footer了。上面几种方式的思维都是正向的,在发现没数据时才想尽办法插一条,但可惜GridView和SqlDataSource都不能手动加空白数据,所以只能更换数据源。于是我干脆来个逆向思维,为什么不能在SqlDataSource查询数据的时候就直接加一个空行进来呢?所以到这里,一切问题都解决了,只需要在SqlDataSource的查询SQL里用UNION整合一条空白数据进来即可,完美解决无数据而造数据的问题。
具体代码就不写了,核心思路就是从数据源头保证至少会有一条空数据存在,这样在GridView里空白数据显示的只是末行的空白而已,无伤大雅,而Footer行也能自动出现了。如果你有强迫症或者数据列里有控件,显示出来不优雅,没关系,也容易解决,在行数据绑定的事件里检查一下当前数据行是不是键值为空,是就让当前行的Visible=false就好了。