欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于如何编写灵活定制列样式的Grid控件

程序员文章站 2022-03-13 11:46:42
...
Grid控件,相信很多人都已经写过,或者重构过了。
对于Grid中的某些功能,实现起来会比较头疼。其中很重要的一个就是定制列样式的实现,如将列设为单选框,下拉框…等等。网上的Grid控件的做法,几乎都是使用的内部定义好的一些样式,使用时进行指定,虽说实现了大部分的需求功能,但对于某些特殊的自定义功能,想实现起来就很没什么办法了,只有扩展源代码。

做Grid控件有一段时间了,被这个问题烦了有一段时间。开始的时候也是模拟网上部分Grid的实现方式,自定义了部分列样式,封装在Grid中,但面对着各种需求的自定义样式,感觉越来越力不从心。

经过一段时间的摸索之后,终找到了一种个人最好的实现方式,对于实现某些自定义样式很方便,也很灵活。可以有效的将列的样式和Grid控件分离开来。实现了高定制化的Grid。

还是用代码来说明吧:

Grid控件中用实现自定义表格的伪代码:
function myGridConfig(id){
    this.__id=id;
    var _self=this;
    ...
    _self.createHead=function(titles){
        this.titles=titles;//设列标题以数组形式存储
        ...
    }
    _self.getdata=function(){
        //从数据库读取数据,并以二维数组的方式返回。
    }
    _self.createBody=function(){
        ...
        var grid=...//表格对象。
        var data=getdata();
        for(var i=0;i<data.length;i++){
            var cells=data[i];
            var tr = grid.insertRow();//添加一行。
            for(var j=0;j<this.titles.length;j++){
                var td=document.createElement("td");
                if(document.all[this.__id+"_col_"+j]){//查找页面中有没有id为 id_col_index 形式的元素.这里使用了IE特有的document.all语法。
                    var customHtml = document.all[this.__id+"_col_"+j].innerHTML;
                    /**替换掉指定部分(即"_id_","_value_")的值。
                    通常的数据中,第一行都是从数据库中读取出来的id,所以此处将_id_替换为cells[0].**/
                    customHtml = customHtml.replace(/_id_/g,cells[0]).replace(/_value_/g,cells[j]);
                    td.innerHTML=customHtml;
                }else{
                    	td.innerHTML=cells[j]?cells[j]:"";
                }
                tr.appendChild(td);//将单元格TD加入TR。
            }
            grid.appendChild(tr);//将TR加入表格。
        }
        ...
    }
    ...
}


有了以上的代码,那么在调用Grid的页面,就可以很方便的实现自定义列样式了。假设从数据库中通过getdata()方法得到的数据为以下形式:
[
["001","张三","男"],
["002","李四","男"],
["003","王五","男"]
]


如想在最后一列加上一个“操作”列。则可以写一个div,将所要实现的功能放在div之中:
//这里是myGrid_col_3..如果Grid控件的__id为"myGrid",它的第四列就会被替换成为其内部的内容。
<div id="myGrid_col_3" style="display:none;">
<a onclick="edit('_id_');">编辑</a>
<a onclick="del('_id_');">删除</a>
//由于在上面的代码中,_id_会被替换为data中的第一列的值,并赋到相应的单元格内。
//所以每点击编辑,就会调用edit方法。并将当前行的第一列值传进去。就可以对专门的某一条数据进行操作。
</div>
<script>
function.onload=function(){
    var gridConfig=new myGridConfig("myGrid");
    var titles=["编号","姓名","性别","操作"]//存储Grid标题的数组
    gridConfig.createHead(titles);
    gridConfig.createBody();
}
</script>

是不是很方便呢?

这样这种方式的好处就是,样式代码和Grid控件分离开了,两者不再耦合在一起,当想要修改某一列的样式时,只要修改那一列的样式所在的div的内容即可。你想到什么样的样式,就可以写什么样的样式,只要你想得到,几乎都可以通过相应的方式实现。

当然,一般当前行数据的id是不会显示在代码中,而是是被隐藏起来的。隐藏的功能只要在myGridConfig中编写相应的代码进行实现就可以了,这里只是讨论自定义列样式的功能,所以就不涉及那方面了。

如果各位对我这个实现有什么看法和建议或者不清楚的地方,欢迎交流和讨论。

另外如果各位有各好的定制列样式的方法,各位是怎么做的呢?
------------------------------------------------------------------------------------------------
本来想把Grid的代码也共享过来,但由公司是使用的平台的特殊性,我写的那些控件都是以特定的格式编写和调用的,Grid控件离开平台就无法运行,要修改很大一部分代码,所以就没做这方面的工作。
(08-20 1:08 by ham)