如何在SSRS报表中添加搜索框,实现双数据集实时无按钮过滤?
嘿,这个需求我之前帮同事实现过,核心就是结合SSRS参数的灵活性和一点前端脚本,绕过默认的「查看报表」按钮,同时让两个数据集跟着输入实时更新。下面是一步步的实操方法:
实现步骤
1. 创建无交互提示的文本参数
首先在报表里新增一个文本类型的参数,命名为SearchText(名字随便取,后面脚本对应上就行),关键设置要注意:
- 勾选「允许空值」「允许空白值」——这样初始状态能显示所有数据
- 必须取消勾选「提示用户输入」——我们不用SSRS自带的参数面板,要自己做搜索框
2. 给两个数据集加过滤规则
针对你要过滤的两个数据集(比如DataSetA和DataSetB),有两种方式加过滤:
方式一:SQL查询里直接加条件(推荐,性能更好)
在数据集的SQL语句末尾加上WHERE子句:
WHERE YourTargetColumn LIKE '%' + @SearchText + '%'
把YourTargetColumn换成你要搜索的字段(比如订单号、客户编码),@SearchText就是我们刚才创建的参数。
方式二:用SSRS数据集过滤器
如果不想改SQL,也可以在数据集的「过滤器」选项卡添加规则:
- 字段:选你要搜索的列
- 运算符:选
Like - 值:输入
="%" & Parameters!SearchText.Value & "%"
两种方式都能实现模糊匹配,输入的内容会自动套在百分号中间,匹配包含该文本的记录。
3. 添加自定义搜索框+实时刷新脚本
接下来要在报表里加一个自定义的搜索输入框,推荐放在报表页眉(这样翻页也能看到):
- 插入一个文本框,右键选择「占位符属性」
- 把「值」的类型改成「HTML - 标记类型」
- 在值里输入这段HTML:
<input type="text" id="customSearchBox" placeholder="输入关键词实时过滤..." onkeyup="triggerRefresh()" />
然后要加一段JavaScript来监听输入,自动刷新报表:
你可以把脚本放在同一个文本框的HTML里(加在input标签后面),或者在报表的「页面加载事件」里添加:
function triggerRefresh() { // 获取输入框的内容 var inputVal = document.getElementById('customSearchBox').value; // 找到SSRS报表容器(ID可能是ReportViewer1,自己用浏览器开发者工具确认下) var reportViewer = document.getElementById('ReportViewer1'); if (reportViewer) { // 设置参数值 reportViewer.SetParameters([{ Name: 'SearchText', Value: inputVal }]); // 触发报表刷新,不用点按钮 reportViewer.RefreshReport(); } }
注意:报表容器的ID在不同环境可能不一样,比如Visual Studio预览里是ReportViewer1,部署到服务器上可能是ReportViewerControl,用浏览器F12查看元素就能找到。
4. 隐藏默认的参数面板和「查看报表」按钮
最后把SSRS自带的参数面板和按钮藏起来:
- 打开报表属性,找到「参数面板可见性」,设置为「隐藏」
- 如果还有残留的「查看报表」按钮,用CSS隐藏,同样放在刚才的HTML文本框里:
<style> /* 替换成你实际的按钮元素选择器,用F12找 */ #ReportViewer1_ctl04_ctl00 { display: none !important; } </style>
一些注意点
- 实时刷新会频繁请求服务器,如果数据集很大,建议加分页或者限制返回行数,避免卡顿
- 部署到服务器前,先在Visual Studio里测试,设计器的脚本支持和服务器端可能有小差异
- 如果企业环境禁用了自定义脚本,这个方法可能用不了,得跟IT确认下权限
内容的提问来源于stack exchange,提问作者Flat_Cap_Hat
相关产品推荐
相关产品推荐

