jqgrid表格下拉搜索多选框优化—使用select下拉多选插件

jqgrid表格插件应该是表格插件中最强大吧,最近项目需要使用jqgrid但又要根据项目需求进行一些私人订制,还好jqgrid的源码写清晰易懂。

jqgrid有个下拉搜索的功能,我们先看下官网的展示,网址:http://www.guriddo.net/demo/bootstrap/。


下拉单选搜索样式还过得去可以将就,使用的html5原生的select。

先简单说下这个下拉搜索的API吧

colModel参数中 要进行下拉搜索的列 添加 style:"select" ,如果下拉的选项是 预先知道 就添加 searchoptions选项,如果为多选下拉搜索 再添加 multiple:true

例如

{name:'operateType',label:'操作类型',align:"center",width: 100, frozen: true,
            stype: "select",

               multiple:true, 
                    searchoptions: { multiple:true, value: ":[All];ALFKI:ALFKI;ALFKI:ALFKI;ANATR:ANATR;ANTON:ANTON;AROUT:AROUT" }

}

如果你的下拉选项要从后台获取,需要配置dataUrl选项 返回的是 select的html字符串代码。

顺便插一句,如果选项中有中文,要注意编码,由于项目中用的spring mvc ,就在 controller方法上添加@RequestMapping(value = "getColDownSelect", produces = "text/html;charset=utf-8") 添加produces 编码就可以啦。


单选的效果


多选的效果


知道原生的多选是怎么操作的吗?安装Ctrl键 然后 点击不同的选项就可以选择多个。我们程序员当然会啦,如果你让客户这么去操作保证绝对不打死你,这么复杂的操作,所以有很多多选下拉框的js插件就应运而生了。用的比较多的jquery.multiSelect.js 、bootstrap-multiselect.js、multiple-select.js等等。

下面进入重点了,本人上面3插件都去试过,发现无一例外 展示选项的 元素无法显示,3种都不展示!!!那就应该是jqgrid的结构样式对下选项影响了。

下面我使用mutiple-select.js来做下拉多选。看下图,单击下拉选项 相应的div 存在于 html结构当中 只是被遮住,另外2种插件也是同样的情况。

 

起初以为与z-index有关,然后改变z-index 并没有什么卵用。然后就去恶补css 相关知识也咨询了前端的同事 ,说有可能是 父元素 设置overflow:hidden影响的。后面发现果然是overflow影响的 搜索框向上的4个祖先元素有overflow:hidden,将其改成visible就可以展示了。


但是样式也 贼乱了吧,调整下样式吧,最后看下效果,这样是不是 整洁很多了吧。


下面贴下代码,代码很简单,核心就是在 jqgrid拼接 select html 完之后使用 select 多选插件,然后在调整样式。

这里说下,本人jqgrid使用的  Guriddo jqGrid JS - v5.1.1 - 2016-06-08 这个版本 ,就是上面官网那个。

在源码$($t).triggerHandler("jqGridAddEditAfterSelectUrlComplete", [elem]);这行下面添加

$(elem).css("padding","0 0");
								//为多选的时候
								if($(elem).attr("multiple")){
									$(elem).multipleSelect({selectAllText:"全选",selectAllDelimiter:["",""]});
									//内容展示不了修改
									$(elem).next().css("overflow","visible")
									.parents("div:eq(0)").css("overflow","visible")
									.parents("th:eq(0)").css("overflow","visible")
									.parents(".ui-jqgrid-hdiv").css("overflow","visible");
									//样式调整
									$(elem).next().css({"padding":"0 0","height":"24px","border":"0"})
									.children("button").css({"margin-left":"0px","height":"24px"})
									.children("div").css({"position":"absolute"});
									$(elem).next().children(".ms-drop").css("position","absolute");
								}

在第二处的setAttributes(elem, options, ['value']); 后面添加 

setTimeout(function(){
						$(elem).css("padding","0 0");
						//多选的时候
						if($(elem).attr("multiple")){
							$(elem).multipleSelect({selectAllText:"全选",selectAllDelimiter:["",""]});
							//内容展示不了
							$(elem).next().css("overflow","visible")
							.parents("div:eq(0)").css("overflow","visible")
							.parents("th:eq(0)").css("overflow","visible")
							.parents(".ui-jqgrid-hdiv").css("overflow","visible");
							//样式兼容
							$(elem).next().css({"padding":"0 0","height":"24px","border":"0"})
							.children("button").css({"margin-left":"0px","height":"24px"})
							.children("div").css({"position":"absolute"});
							$(elem).next().children(".ms-drop").css("position","absolute");
						}
					},5);

这里加setTimeout是如果使用dataUrl时,先将select渲染完了然后再使用下拉多选插件。

使用其他下拉插件也一样,根据展示的下拉选项 将其 祖先元素 的overflow 改成visible可见 然后 下拉选项又是绝对定位 会飘出文档流就展示到表格上方了,然后就是具体情况具体调整样式了。

好了,收工。



  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
在 C# 中封装 jqGrid 表格搜索,可以使用 jQuery 的 AJAX 功能向后端发送请求并获取数据,然后使用 JSON 序列化和反序列化来处理数据。以下是一个简单的示例: 首先,在前端页面中,你需要定义一个 jqGrid 表格,并且在表格上方添加搜索框和搜索按钮。这里假设搜索框的 ID 为 `searchInput`,搜索按钮的 ID 为 `searchButton`,表格的 ID 为 `grid`: ``` html <div> <input type="text" id="searchInput"> <button type="button" id="searchButton">搜索</button> </div> <table id="grid"></table> ``` 接下来,在 JavaScript 中,你需要定义一个函数来处理搜索请求,并使用 AJAX 向后端发送请求。这里假设后端接口的 URL 为 `/api/search`: ``` javascript function search() { var keyword = $("#searchInput").val(); $.ajax({ url: "/api/search", data: { keyword: keyword }, success: function(data) { $("#grid").jqGrid("setGridParam", { data: data }).trigger("reloadGrid"); }, error: function(xhr, status, error) { alert("搜索错误:" + error); } }); } ``` 在上面的代码中,`search` 函数首先从搜索框中获取关键词,然后使用 AJAX 向后端发送请求,请求参数中包含关键词。如果请求成功,就将返回的数据设置到 jqGrid 中,并触发表格重新加载的事件。如果请求失败,就弹出错误提示框。 最后,在 C# 后端中,你需要处理搜索请求,并返回符合搜索条件的数据。这里假设你使用 ASP.NET Web API 2 来处理请求,你可以这样编写控制器方法: ``` csharp public IHttpActionResult Search(string keyword) { var data = GetData(); // 获取原始数据 var filteredData = data.Where(d => d.Contains(keyword)); // 进行筛选 return Json(filteredData); // 返回 JSON 格式的数据 } ``` 在上面的代码中,`Search` 方法首先从数据源中获取原始数据,然后使用 LINQ 进行筛选,找出符合搜索关键词的数据。最后,将筛选后的数据以 JSON 格式返回给前端。 需要注意的是,这里的 `GetData` 方法需要根据你的具体业务逻辑来实现,它可以从数据库、文件、缓存等数据源中获取数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值