jqgrid columnChooser列的自定义及存储和获取

本文介绍如何使用 JqGrid 的 columnChooser 功能让用户自定义显示或隐藏列,并将这些设置保存到 MySQL 数据库中,以便下次加载表格时能够记住用户的偏好设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        jggrid可以通过setcolumns设置列的自定义显示,不过这种方法已经被否决了,现在的方法是columnChooser。我们的问题是既然用户可以选择需要显示和隐藏那些列,那么是否可以把这些信息都存储起来,在用户再次打开这些表时,可以显示对应的列。有很多种方式存储这个数据,可以用浏览器本地存储localstorage,但是问题是当用户换了浏览器或者电脑时就不行了,现在以用mysql存储作为例子。selectColumn用于获取需要隐藏的列,并存入数据库。getHiddencolumn用于获取该表的信息和对表的部分列进行隐藏。

/**
 * Multiselect save and get cloumn information 
 *
 * @author cc_fys
 */
	 function selectColumn(tableName,pageName,myID)
	    {
	    	console.log(tableName);
	 	  $(tableName).jqGrid('navGrid',pageName,{add:false,del:false,edit:false,search:false,refresh:false}); 
	 	  $(tableName).jqGrid('navButtonAdd', pageName, {
	         caption: "隐藏显示列",
	         buttonicon: "ui-icon-calculator",
	         title: "选择列", 
	         onClickButton: function () {
	             $(tableName).jqGrid('columnChooser',{
						width: 550, 
						dialog_opts: {
							modal: true,
							minWidth: 470,
							height: 470,
							show: 'blind',
							hide: 'explode',
							dividerLocation: 0.5
						},
						 done : function (perm) {
						      if (perm) {
						          //点击确定 
						          this.jqGrid("remapColumns", perm, true);
						          var width = $(window).width()-150;   
						          $(tableName).setGridWidth(width,true); 
						          //要存的就json,已经 隐藏部分的部分  
						          //获取列名  
				                    var colModel=$(tableName).jqGrid('getGridParam','colModel');  
				                    var newColumnName = [];  
				                    for (var i=0;i<colModel.length;i++)   
				                    {  
				                        var columnHidden = colModel[i].hidden;   
				                        if(columnHidden==true)  
				                        {  
				                           // newColumnName.push(colNames[i]);  
				                        	newColumnName.push(i);  
				                        }  
				                    } 
				                   var strHidden=JSON.stringify(newColumnName);
				                   console.log(strHidden);
				                   //数据库存储
				                   $.ajax({
				   					type : "POST",
				   					url : "myurl",
				   				    data:{serverID:myID,hiddenC:strHidden},
				   					success : function(data) {
				   						console.log('finish');
				   					}});
						         }
						 }});
	         }
	 	 });  
	    	
	    };
	    function getHiddencolumn(tableName,myID)
	    {
	    	 $.ajax({
	 			type : "POST",
	 			url : "myurl",
	 		    data:{serverID:myID},
	 			success : function(data) {
	 				console.log(data);
	 				 if(data&&data!=''&&data!='[]')//这里做隐藏列
	 					{
	 					    var jsonData=JSON.parse(data);
	 					    var colModel=$(tableName).jqGrid('getGridParam','colModel'); 
	 					    jsonData.forEach(function(item,index)
	 					    {
	 					    	//console.log(colModel[item].name);
	 					    	$(tableName).setGridParam().hideCol(colModel[item].name).trigger("reloadGrid");
	 					    });
	 					    //调整宽度
	 					    var width = $(window).width()-150;   
	 				        $(tableName).setGridWidth(width,true); 
	 					} 
	 			}});
	    	
	    };
package ciss.controller.savecolumn;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.cxf.common.classloader.FireWallClassLoader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import ciss.web.jdbc.MySQL;

@Controller
@RequestMapping("/mysql")
public class SaveColume {
	@ResponseBody
	@RequestMapping(value = "/setHiddenColumn")
	//这个改为分以下两步,
	//没有列话就先添加一列之后再存数据
	//没有用户的话添加一行用户
	//有用户有行之后才更新
	public String setHiddenColumn(HttpServletRequest request, HttpServletResponse response) 
   {
        String ID=request.getParameter("serverID");
        String userName=request.getSession().getAttribute("userName").toString();
        String hiddenColume=request.getParameter("hiddenC");
        //String sql= "insert into hide_column(username,c"+ID+") values(?,?)"; 
        String sql="UPDATE hide_column set c"+ID+"='"+hiddenColume+"' where username='"+userName+"'";  
        //System.out.println(sql);
        Connection conn = MySQL.getConnection();
        if(addUserAndRow(conn,userName,ID))
        {
		   try {  
		       PreparedStatement ps = conn.prepareStatement(sql);  
		       ps.executeUpdate();  
		       System.out.println("添加成功!");  
		       return "finish";

		 }catch (SQLException e) {
			 
		 e.printStackTrace();
		 return "更改数据失败!";
	     }
        }
        else
        {
		return "创建列或用户出错啦!";
        }
		
	}
	@ResponseBody
	@RequestMapping(value = "/getHiddenColumn")
	public String getHiddenColumn(HttpServletRequest request, HttpServletResponse response) 
   {
		   ResultSet resultSet;
		    String result="[]";
		    String ID=request.getParameter("serverID");
	        String userName=request.getSession().getAttribute("userName").toString();
	        System.out.println(ID);
	        System.out.println(userName);
	        String sql= "select * from hide_column where username='"+userName+"'"; 
	        System.out.println(sql);
	        Connection conn = MySQL.getConnection();
	       try {
	        	PreparedStatement ps = conn.prepareStatement(sql);  
	        	resultSet = ps.executeQuery(sql);
	        	if(isExistColumn(resultSet,"c"+ID))
	        	{
	        	resultSet.first();
	        	System.out.println(resultSet.getString("c"+ID));
	        	result=resultSet.getString("c"+ID);
	        	}
	            resultSet.close();
	            //conn.close();  
	        }catch (Exception e) {
	        	e.printStackTrace();
	        }
			return result;
 }
	//这个是用来创建表的,一般情况下不要调用!
	public String addHiddenColumn(HttpServletRequest request, HttpServletResponse response) 
   {
		Connection conn = MySQL.getConnection();
		for(int i=200;i<=1000;i++)
		{
			String sql="alter table hide_column add c"+i+" varchar(255) default '[]'";  
	        System.out.println(sql);
			   try {  
			       PreparedStatement ps = conn.prepareStatement(sql);  
			       ps.executeUpdate();  

			 }catch (SQLException e) {
			 e.printStackTrace();
		     }

		}
		return "finish";
   }
	//查看 是否有某一列
	public boolean isExistColumn(ResultSet rs, String columnName) {  
	    try {  
	        if (rs.findColumn(columnName) > 0 ) {  
	            return true;  
	        }   
	    }  
	    catch (SQLException e) {  
	        return false;  
	    }  
	      
	    return false;  
	} 
	//添加指定用户 或者 指定字段
	public boolean addUserAndRow(Connection conn,String userName,String rowName) {  
	    try {  
	    	String sql= "select * from hide_column where username='"+userName+"'"; 
	    	PreparedStatement ps = conn.prepareStatement(sql);  
        	ResultSet rs= ps.executeQuery(sql);
        	if(isExistColumn(rs,"c"+rowName)==false)
        	{//添加新列
        		String sql1="alter table hide_column add c"+rowName+" varchar(255) default '[]'";  
        		PreparedStatement ps1 = conn.prepareStatement(sql1);  
			    ps1.executeUpdate(); 
        	}
        	if(rs.next())
        	{
  		       System.out.println("不用添加用户");
        	}
        	else 
        	{//添加新用户
        		String sql2= "insert into hide_column(username,c"+rowName+") values(?,?)"; 
        		System.out.println(sql2);
        		PreparedStatement ps2 = conn.prepareStatement(sql2);  
        		ps2.setString(1, userName);
        		ps2.setString(2, "[]");
  		        ps2.executeUpdate(); 
        	}
             return true;
	        }  
	    catch (SQLException e) 
	       {  
	        return false;  
	       }  
	} 
	
	
}
存储的数据像这样,前端比较好处理

最后只需要在表格初始化的地方调用就可以了,非常简便 。其中需要传递表格ID,page的ID,以及该表的标识符。

getHiddencolumn('#tables0',1367);
selectColumn('#tables0','#page0',1367);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值