需求描述

实际应用中,我们可能需要导出表格内容,或者在页面回发时根据用户权限下载文件(注意,这里的导出与下载,都是在后台进行的,和普通的一个链接下载文件不同)。

点击按钮导出表格

由于FineUI 默认支持AJAX,而导出与下载其实是一种破坏AJAX的操作,因为一般的导出代码如下所示:

1 Response.ClearContent();2 Response.AddHeader("content-disposition", "attachment; filename=下载的文件.txt");3 Response.ContentType = "text/plain";4 Response.ContentEncoding =System.Text.Encoding.UTF8;5 Response.Write("下载的文件内容");6 Response.End();

这里直接对Response对象进行操作,所以在导出和下载时要禁用AJAX

比如通过按钮导出表格内容,我们来看下导出按钮的标签定义:

1 <f:ButtonID="Button1"EnableAjax="false"DisableControlBeforePostBack="false"
2 runat="server"Text="导出为Excel文件"OnClick="Button1_Click">
3 </f:Button>

这里两个参数要注意:

  1. EnableAjax:表明本次导出操作非AJAX,也就是说点击此按钮时页面会刷新,但是页面上其他的操作任然是AJAX的。
  2. DisableControlBeforePostBack:这个参数默认是true,就是在AJAX操作之前禁用按钮,防止用户操作过快多次点击。这里非AJAX操作,自然要禁掉。

至于,表格的标签以及导出的代码,不是这篇文章的重点,就不再罗列,需要的网友可自行下载源代码。

  1. 运行页面截图
  2. 下载的文件

选择需要导出的列

有时我们仅仅需要导出表格中需要的列,最终实现效果如下所示:

  1. 在弹出窗口中选择需要导出的列
  2. 点击"导出"按钮产生的文件

这里我们的关注点不是如何导出选中的列,而是在那个后台消息处理中做这个导出?

实际上,当我们点击弹出窗体的"导出" 按钮时,事件处理是在Window的OnClose事件中进行的,如下所示:

1 protected void Window1_Close(objectsender, FineUI.WindowCloseEventArgs e)2 {3 Response.ClearContent();4     Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");5     Response.ContentType = "application/excel";6     Response.ContentEncoding =System.Text.Encoding.UTF8;7     Response.Write(GetGridTableHtml(Grid1, e.CloseArgument.Split('#')));8 Response.End();9 }

同样,由于这个过程直接操作了Response对象,会破坏FineUI默认的AJAX过程,所以关键点是要设置Window的EnableAjax=false,如下所示:

1 <f:WindowID="Window1"Title="选择需要导出的列"Hidden="true"EnableIFrame="true"
2 EnableMaximize="true"Target="Top"EnableResize="true"runat="server"OnClose="Window1_Close"
3 IsModal="true"Width="450px"Height="250px"EnableAjax="false">
4 </f:Window>

表格行内文件下载(LineButtonField)

先来看下最终实现的效果:

注意,在这个界面中,不同按钮是否禁用AJAX不同:

  1. "选中了哪些行":启用AJAX
  2. "按钮"列:启用AJAX
  3. "下载"列:禁用AJAX

如果是仅仅设置表格的 EnableAjax=false,虽然可能正常完成"下载"列的功能,但是"按钮"列也会导致页面刷新,这就不对。

解决办法也很简单,让表格继承PageManager或者Web.config的默认设置(EnableAjax=true),然后设置"下载"列的EnableAjax=false,如下所示:

1 <f:LinkButtonFieldHeaderText="&nbsp;"Width="80px"CommandName="Action1"Text="按钮" />
2 <f:LinkButtonFieldHeaderText="&nbsp;"EnableAjax="false"Width="80px"CommandName="Action2"Text="下载" />

再来看下后台的事件处理:

protected void Grid1_RowCommand(objectsender, FineUI.GridCommandEventArgs e)
{object[] keys =Grid1.DataKeys[e.RowIndex];string result = String.Format("你点击了第 {0} 行,第 {1} 列,行命令是 {2}", e.RowIndex + 1, e.ColumnIndex + 1, e.CommandName) +"<br>" +String.Format("当前行数据 - 编号:{0},姓名:{1}", keys[0], keys[1]);if (e.CommandName == "Action1"){//AJAX回发labResult.Text =result;}else if (e.CommandName == "Action2"){result= result.Replace("<br>", "\r\n");//非AJAX回发
Response.ClearContent();Response.AddHeader("content-disposition", "attachment; filename=row_" + e.RowIndex + ".txt");Response.ContentType= "text/plain";Response.ContentEncoding=System.Text.Encoding.UTF8;Response.Write(result);Response.End();}
}

本章小结

本篇文章介绍了导出表格与下载文件的三个不同场景,大家要意识到这种对Response的直接操作,破坏了FineUI的默认AJAX处理,因此要禁用AJAX。

源代码与在线示例

本系列所有文章的源代码均可自行下载:http://fineui.codeplex.com/

在线示例:

  1. http://fineui.com/demo/#/demo/grid/grid_excel.aspx
  2. http://fineui.com/demo/#/demo/grid/grid_excel_selectcolumns.aspx
  3. http://fineui.com/demo/#/demo/grid/grid_rowcommand_download.aspx

第三个示例会增加到下个版本的FineUI(开源版)中,所以在线示例暂不可用,需要的同学请自行下载全部源代码,本机运行。

如果本文对你有所启发或者帮助,请猛击“好文要顶”,支持原创,支持三石!

另附24张专业版高清大图

《FineUI小技巧》系列文章目录

FineUI小技巧(3)表格导出与文件下载相关推荐

  1. FineUI小技巧(4)关闭窗体那些事

    前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控 ...

  2. FineUI小技巧(5)向子窗口传值,向父窗口传值

    前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值 ...

  3. 小技巧--table表格td内容垂直居中方法

    小技巧–table表格td内容垂直居中方法 前端页面编写时,table表格排版时最容易遇到的,就是单元格内的内容无法居中,又不能写行高时,可以使用以下方法: table td {vertical-al ...

  4. vswatch窗口怎么出来_学会这6个打印小技巧,表格想怎么打就怎么打,让工作效率翻倍...

    [温馨提示]亲爱的朋友,阅读之前请您点击[关注],您的支持将是我最大的动力!#学问分享官# 在无纸化的办公时代,我们已很少涉及打印工作了,但有些资料.表格必须呈报纸质版.今天阿钟老师分享几个Excel ...

  5. 同一字段降序个升序_5个打印小技巧,表格打印没烦恼

    Excel表格打印设置有很多,这里罗列最常见.最实用的五个技巧分享给大家. 打印区域调整 日常打印中会出现下面这种情况,要打印A-F列,预览时发现少了一列: 回到Excel界面,点击底部的" ...

  6. 【知识兔】Excel教程小技巧之表格加密保护

    工作中,我们经常会遇到一些比较机密的数据,需要做加密.通常我们遇到的加密情况有二种,第一种,打开的时候需要输入密码,没有正确的密码,文件都打不开. 第二种,文件可以打开,但表格内的数据只能看,修改的时 ...

  7. 办公软件小技巧:Excel表格自动排序

    转自:http://www.pinlue.com/article/2020/12/0610/5111389475030.html

  8. php excel导出sheet表,phpexcel来做表格导出(多个工作sheet)

    1.先得去下载phpexcel文档,加压下来 /** * 简单实用Execl */ set_include_path('.'.get_include_path().PATH_SEPARATOR.dir ...

  9. html table边框细线,HTML小技巧将table边框改为细线

    HTML制作新手在用TABLE表格时,会碰到如何改变边线粗线,因为默认的TABLE边线设置即使是1px 是很粗的.因此会使用其他一些方法来制作出细线边框,这里介绍一种利用CSS来实现细线的方法,很有效 ...

最新文章

  1. 5款没有专利纠葛的Linux发行版
  2. apache下配置php
  3. Leaflet中使用NavBar插件实现导航(前进后退)效果
  4. java不抛出方法异常,java – 重写方法不会抛出异常
  5. 判断Java 对象实例是否死亡
  6. 全国计算机等级考试题库二级C操作题100套(第87套)
  7. python:改良廖雪峰的使用元类自定义ORM
  8. MySQL在其版本迭代后Online DDL功能发生了哪些变化?
  9. java数据结构图_java总结数据结构和算法
  10. notesDocument类的HTTP URL属性 和note URL属性的区别
  11. 译:Datetime类型的扩展
  12. 你真的懂Linux吗?Linux运维从业方向与前景
  13. 深入理解和使用nginx
  14. 不光荣的“革命”——“甘露之变”后的晚唐政治
  15. 时间表达式java定时器_java--定时器
  16. 数学建模学习:蒙特卡洛模拟
  17. 144项大神级ppt制作技术
  18. 劝学:不积跬步,无以至千里,不积小流,无以成江海.
  19. 【计算机算法】递归——打印旋转方阵(正转及逆转)
  20. linux下socket编程处理TCP粘包

热门文章

  1. java线程池 core_Java 线程池 ThreadPoolExecutor 的使用
  2. [Ext JS ]3.4 数字输入框 numberfield
  3. Java获取泛型类的实际类型的实例
  4. [码海拾贝 之TC] 使用View 定义动态的Class
  5. [Oracle] 日期处理
  6. python中bar函数的用法_Python:如何在函数中使用progressbar
  7. js add方法_Vue.js列表过渡
  8. SQLyog客户端常用快捷键
  9. 禁用,元素设置为不可点击
  10. JavaScript中的XMLHttpRequest对象