【8】数据浏览表格的快速输出

阅读目录

  • 用什么来展示数据列表?

  • 表格还是列表?

  • 表头

  • 对表格输出的封装

  • 生成表格的实例

  • 功能的扩展

页面数据和控件的自动交换机制中,我们通过PageX实现了一种快速的控件和数据交换机制,能够方便快捷地完成数据库中的数据记录的管理。一般情况下,在进入这个编辑页面之前,还应该有另外一个页面,可以一次展示多条数据记录的信息。在这个数据的列表界面中,可以进行各种操作,如删除、跳转、编辑等。这个数据列表页面不仅可以按照数据库的分类展示数据,也可以根据需要进行展示,如按指定字段排序、根据查询结果展示、分页展示等。

回到顶部

用什么来展示数据列表?

由于数据列表页面在数据管理中十分常用,因此,在微软的开发工具的发展历史中,一直都有相关的控件。从早期的DataGrid、DataList控件,到C#中的DataGridView,都试图提供给用户一个方便快捷的解决方案。但从实际使用的角度来看,效果并不理想。特别是在Web应用程序的开发中,使用这类现成的控件,达到初步的演示效果固然简单。但是一旦进一步深入,遇到一些实际中复杂的需求,开发的复杂度就变得直线上升了,有时甚至根本无法实现。

经过多次碰壁之后,对于数据列表页面的开发,逐步形成一套不依赖各种现成的控件,而以HTML代码为核心的解决方式。经过多次的实际项目的考验,较好地完成了需求。使用HTML代码展示数据,有以下优势:

1、HTML代码稳定。在各种浏览器下都能正常工作;

2、可控性强。数据列表页面的所有HTML输出,都是编码实现的。因此,对于任何的需求和修改,都相当容易实现。

实现中,不仅要控制输出数据列表的HTML代码,同时还必须要考虑其他因素,如分页、参数传递、查询、页面回调等。从某种意义上来说,这种做法算是一种“重新制造轮子”的行为。但是好处在于,只要了解所有这些是如何实现和工作的,那么,我们对于页面的掌控的程度可以达到一个新的高度。在实际的应用中,配合JQuery、CSS样式表和Ajax,可以发挥强大的威力,达到“无所不能”的境界。

回到顶部

表格还是列表?

输出数据库中数据列表,实际上就是以格式化的方法,把一个多行多列的数据展示出来。可以选择的方案,可以用列表UL或者表格Table。以当前流行的DIV+CSS而言,似乎用UL来展示数据更加符合规范。但在实际的应用中,列表还是有很多不理想的地方:

1、要求较多。用UL展示数据,直接写出的HTML代码,不加任何样式描述的话,列表的数据就显得混乱。因此,必须要有相应的CSS来配套。

2、多行多列的样式代码较复杂。行高度、各列的宽度、对齐等都需要控制管理,特定条件下,还可能遇到错行的情况。

下面,我们不妨按照上述的构造思路构造一个数据列表,使用的范例数据库中book表数据如下:

在页面中放置一个待替换变量strContent,将构造好的HTML代码放置到该变量中:


<body>
<form id="form1" runat="server">
<div>
<%=strContent %>
</div>
</form>
</body>

在后台的代码中进行处理,获取数据,构造列表HTML代码,处理代码如下:


protected string strContent;
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = AccessDB.GetData("select top 5 * from book");
strContent += "<UL>";
for(int i=0;i<dt.Rows.Count;i++)
{
strContent += "<LI><SPAN>" + dt.Rows[i]["书名"].ToString() + "</SPAN><SPAN>" + dt.Rows[i]["出版单位"].ToString() + "</SPAN></LI>";
}
strContent += "</UL>";
}

输出的结果中,没有格式控制的情况下,效果就不好看:

相比之下,表格就显得更加“皮实”一些:

  1. 只要表格的HTML代码出来,即使不要CSS,展示出的效果就大致差不多了;

  2. 永远不会错行;

  3. 各种浏览器对于表格的分歧较小,兼容性的压力更小一些

对上例,只要修改一下,改为按照Table输出,如下:


strContent += "<Table>";
for(int i=0;i<dt.Rows.Count;i++)
{
strContent += "<TR><TD>" + dt.Rows[i]["书名"].ToString() + "</TD><TD>" + dt.Rows[i]["出版单位"].ToString() + "</TD></TD>";
}
strContent += "</Table>";

结果就大不一样,如下:

综合起来,对于数据列表页面的展示,以表格的形式来展示,在稳定性和通用性方面,能够更好一些。

回到顶部

表头

上面的表格的格式和美观度,暂时不用考虑,对于表格的样式可以通过CSS统一控制,当前主要把表格中的重要构成进行分析。首先要考虑的,就是表头。本着最简单的原则,表头可以从DataTable中获取,如dt.Columns[i].ColumnName就可以返回dt的第i列的表名。因此,可以构造表头如下:


DataTable dt = AccessDB.GetData("select top 5 * from book");
strContent += "<Table border=1>";
strContent += "<TR>"; //表头行
for (int i = 0; i < dt.Columns.Count; i++)
{
strContent += "<TD>"+dt.Columns[i].ColumnName+"</TD>";
}
strContent += "</TR>";
for(int i=0;i<dt.Rows.Count;i++)
{
strContent += "<TR>";
for (int j = 0; j < dt.Columns.Count; j++) //逐列处理
{
strContent += "<TD>" + dt.Rows[i][j].ToString() + "</TD>";
}
strContent += "</TR>";
}
strContent += "</Table>";

上述代码中,作了更加通用化的处理,不再指定特定的列名,而是对dt的所有列进行显示。显示效果如下:

回到顶部

对表格输出的封装

从上例可以看出,用表格输出数据列表的功能,是可以封装起来的。将上述处理放到一个独立的方法中,DataTable作为它的参数,表格生成就可以变得通用化了。

除了基本数据之外,表格生成还必须考虑其他的要求:列显示多少?行显示多少?列标题名?是否要添加控制列?这些要求,如果全部都放到封装的函数中,将变得非常的繁琐且累赘,因此还是需要有所取舍,尽量保证把常用的一些条件和要求封装起来,不常用的采取其他的方式来弥补。以下是一些较常用的要求:

1、列名的重命名。尽管可以在查询sql语句中对列名就重新命名,但为了通用性,仍然增加了这个选择。

2、列的隐藏。某些列,可能会用到,但是不需要显示。比如,ID列。

3、控制链接。对每行数据的具体的控制操作,常用的有删除和编辑。

4、跳转链接。单击行,跳转到某个展示链接。

封装的表格生成函数如下:


public static string FullTable(DataTable dt, string KeyField, string tableid, string HideColumn, string NameChange, bool ShowDel, bool ShowEdit, string LinkColumn, string LinkStyle,string DelPage,string EditPage)

各个参数的含义如下:

  • dt:数据表

  • KeyField:关键字段名

  • tableid:表格的html节点id,便于使用样式进行控制

  • HideColumn:隐藏列,不显示该列,用“|”进行定界。如:"|书号|" 或 "|出版年|书号|"

  • NameChange:列名重命名。如:"ID=编号;出版单位=出版社;"

  • ShowDel:是否显示删除链接

  • ShowEdit:是否显示编辑链接

  • LinkColumn:需要进行链接的列名

  • LinkStyle:链接的样式

  • DelPage:删除页面

  • EditPage:删除页面

上述的各种参数,最后生成的表格包含了大多数数据列表需要的功能,但是对于某些情况可能就过于复杂了。因此,表格生成函数还有两个精简版本:


//只有跳转链接的表格
public static string LinkedTable(DataTable dt, string KeyField, string tableid, string HideColumn, string NameChange, string LinkColumn, string LinkStyle)
//只有表格
public static string SimpleTable(DataTable dt, string tableid)
public static string SimpleTable(DataTable dt, string tableid, string HideColumn, string NameChange)

这些简化的方法,在不需要复杂表格的地方使用。下面主要展示完全版本的生成方法,简化版本的参数和完全版一致。

回到顶部

生成表格的实例

下面,针对上面的范例表格生成一个功能更加全面的表格:


DataTable dt = AccessDB.GetData("select top 5 * from book");
strContent = Formater.FullTable(dt, "ID", "tblsample", "|出版年|书号|", "ID=编号;出版单位=出版社;", true, true, "书名", "showbook.aspx?id=KeyField", "del.aspx", "edit.aspx");

只要两行代码,就可以生成以下的表格:

回到顶部

功能的扩展

上述代码功能已经比较全面了,但仍然可能遇到各种各样的特别的需求,单独对生成函数进行修改增加复杂度,因此往往采用对调用函数的附加处理来实现。由于表格的生成过程我们完全理解,因此,这些修改可以通过各种手段实现。比如下面这些需求:

1、链接需要在新窗口中打开

原来的参数是"showbook.aspx?id=KeyField",实现机制是替换后生成最终的HTML代码,因此可以对这个参数进行处理:

"showbook.aspx?id=KeyField‘ target=‘_blank"

2、修改链接的名称

编辑和删除链接的名字是函数自动生成的,如果要修改,可以通过对生成的HTML进行提花完成。

3、新的数据列

如果需要展示一些动态的数据列,可以对DataTable进行处理,插入新列,填充新值,再传递给生成函数。

4、前端代码需要ID列,但不要显示

可以通过JS代码或者JQuery代码隐藏第一列。

5、新增控制列

可以通过前端代码,对行或者表格的单击事件进行处理,提取该行的ID,并转换为相应的控制链接。

【8】数据浏览表格的快速输出,布布扣,bubuko.com

时间: 2024-10-06 08:57:09

【8】数据浏览表格的快速输出的相关文章

Excel数据表格排版及输出打印技巧大全视频课程

课程目标Excel使用最多的就是对数据表格排版和输出打印.本课程将以通俗易懂的教学方式帮助学员熟悉这方面的知识.适用人群电脑爱好者.所有职场人士课程简介在我们的工作和学习中已经离不开Excel,正确熟练地操作Excel已成为信息时代对每个人的要求.而Excel使用最多的就是对数据表格排版和输出打印.本课程将以通俗易懂的教学方式帮助学员熟悉这方面的知识.本课程章节计划表:第一章:输出打印概述第二章:安装打印机驱动及注意事项第三章:将表格充满A4纸并打印网格线第四章:横向打印和竖向打印第五章:打印指

Excel数据表格排版及输出打印技巧大全限时特惠

在我们的工作和学习中已经离不开Excel,正确熟练地操作Excel已成为信息时代对每个人的要求.而Excel使用最多的就是对数据表格排版和输出打印.本课程将以通俗易懂的教学方式帮助学员熟悉这方面的知识.本课程章节计划表:第一章:输出打印概述第二章:安装打印机驱动及注意事项第三章:将表格充满A4纸并打印网格线第四章:横向打印和竖向打印第五章:打印指定区域的数据内容第六章:在报表每页打印图片或公司图标第七章:为报表背景添加水印文字1.快速制作水印图片2.为excel文件添加水印并打印第八章:所有页面

快速输出int 自定义函数write()

void write(int x) { if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; int len=0,buf[15];while(x)buf[len++]=x%10,x/=10; for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; } 这个函数可以快速输出一个int类型的数据,比cout和printf快多了.

常用快速读入快速输出

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置. 简要介绍 众所周知,就运行速度而言,getchar()快于scanf快于cin,putchar()快于printf快于cout. 但getchar()和putchar()每次只能操作一个字符,使用起来比较麻烦. 于是就出现了快读.快速输出. 它们的原理都是把需要读入\输出的数字(本文只能用于处理整数)一位一位地输出,从而减少运行时间. 代码 1 #include<cstdio> 2 using namespace std; 3

百万数据如何在前端快速流畅显示?

如果要在前端呈现大量的数据,一般的策略就是分页.前端要呈现百万数据,这个需求是很少见的,但是展示千条稍微复杂点的数据,这种需求还是比较常见,只要内存够,javascript 肯定是吃得消的,计算几千上万条数据,js 效率根本不在话下,但是 DOM 的渲染浏览器扛不住,CPU 稍微搓点的电脑必然会卡爆. 本文的策略是,显示三屏数据,其他的移除 DOM. 一. 策略 下面是我简单勾画的一个草图,我们把一串数据放到一个容器当中,这串数据的高度(Data List)肯定是比 Container 的高度要

jQuery操作列表数据转成Json再输出为html dom树

jQuery 把列表数据转成Json再输出为如下 dom树 <div id="menu" class="lv1"> <ul class="menu"> <li><a href="#" class="parent"><span>aaaaaaaaaaa</span></a> <div class="lv2&quo

【C语言】使用指向指针数据的指针变量,输出一组字符串

//使用指向指针数据的指针变量,输出一组字符串 #include <stdio.h> int main() { char * name[]={"beijing","huanying","nin","!"}; char **p; int i; for(i=0;i<4;i++) { p=name+i; printf("%s ",*p); } printf("\n"); re

导出数据到表格PHP

导出数据到表格 public function excel(){ $filename = '导出表格'; $header = ['编号','名称']; $index = ['id','name']; $list = array( 0 => array('id' => 1, 'name' => 'fdfs'), 1 => array('id' => 2, 'name' => 'ffdfdsafs'), 2 => array('id' => 3, 'name'

打印流 -可将数据写入文件/可改变输出方向

打印流 java.lang.Object 继承者 java.io.OutputStream 继承者 java.io.FilterOutputStream 继承者 java.io.PrintStream 与其他输出流不同,PrintStream 永远不会抛出 IOException: 打印的所有字符都使用平台的默认字符编码转换为字节.有很多OutputStream的成员方法 构造方法: PrintStream(File file) 输出的目的地是一个文件: PrintStream(File fil