请大家帮我看一个RS显示的程序

ghlfllz 2003-05-19 09:28:04
我想写一个记录集显示的公共模块,已经基本完成,但还存在一引起不尽如人意的地方,请各位帮忙看看改改,就算是抛砖引玉吧
注:本程序参考了lovingkiss的动态用鼠标改变表格宽度的程序

下面是开始开发时写的一个需求:
-----------------------------------------------------------------------
模块名称:disprs
模块语言:VBScript(服务器端)、JScript(客户端)
模块功能:
1、将创建的数据库的记录集用表格显示出来;
2、表格的表头(第一行)为字段名,第二行以后为记录集的内容;
3、可以直接用鼠标调整表格的每一列的宽度;
4、表格的每一行前面都显示一个多选框,用于选择该记录,并可以向服务器端提交(最好是存储记录的ID);
5、表格的内容的每两行可以用一明一暗两种颜色显示,并且颜色值可以自定义(颜色值相同时为同色显示);

说明信息:
一、数据库说明
1、数据库的字段名可以是中文和英文;
2、如果为中文则将它直接作为表格的表头;
3、如果是英文则将一个列表与子段顺序相对应中文字符列表传递给程序,作为显示的表头;
4、将数据库连接的命令以及打开记录集的SQL命令传递给程序;

二、表格的显示样式
1、表格的宽度、表格的背景颜色、表头的背景颜色、表头的高度、表格内容每行的高度和行的明暗背景颜色可以自定义;
2、表格的显示样式与Access相似,需要注意如下几点:
3、表格的边框宽度为0;
4、表头在单击时有按下与弹起效果;
5、表格的宽度可以调节;
6、表格内容的对齐方式可以自定义;

三、表格大小的改变方法
1、用一个图片或一个宽度为一个像素的单元格或竖线作为两列的分隔符;
2、拖动时的光标为Access中的拖动光标(系统没有则自己装载);
3、只有鼠标在首行时才能调节列的宽度;
4、每列都定义一个最小宽度,宽度为最小宽度是不能调节宽度;
5、当最小宽度小于表格中内容的宽度则需要像Access隐藏一部分内容(可行性需要研究);

四、封装表格的容器
一个带水平和垂直滚动条剪切层
-----------------------------------------------------------------------
...全文
41 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tigerwen01 2003-05-19
  • 打赏
  • 举报
回复
这有什么好指教的,能用就行,再说,完成同一功能的程序代码的写法那是因人而异的嘛。
ghlfllz 2003-05-19
  • 打赏
  • 举报
回复
请各位多多指教
ghlfllz 2003-05-19
  • 打赏
  • 举报
回复
接上贴:

<script language="javascript">
/*******************************函数区*******************************/
//函数名称:MM_preloadImages
//函数功能:预装载图片
//函数参数:需要进行预装载处理的图片列表
//函数返回:直接返回
function MM_preloadImages() {
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

//函数名称:MM_findObj
//函数功能:在页面范围查找字符串参数所对应的对象名,并将该变量转化为Object型
//函数参数:需要进行转换的字符串
//函数返回:x,转换完成后的Object型变量
function MM_findObj(n, d) { //v4.0
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && document.getElementById) x=document.getElementById(n); return x;
}

//函数名称:tableborderdis
//函数功能:初始化表格的各单元格的边框
//函数参数:
//curwidth,边框的宽度;
//headbordercolor,表头与外框的边框颜色;
//contentbordercolor,内容边框的颜色;
//函数返回:无
function tableborderdisp(curwidth,headbordercolor,contentbordercolor) {
var tabii,tabjj;
for (tabii=0;tabii<mytable.rows.length;tabii++) {
for (tabjj=0;tabjj<mytable.rows[tabii].cells.length;tabjj++) {
switch (tabii) {
case 0:
//第一行
mytable.rows[tabii].cells[tabjj].style.borderTop=curwidth+"px solid "+headbordercolor;
mytable.rows[tabii].cells[tabjj].style.borderLeft=curwidth+"px solid "+headbordercolor;
break;
case 1:
//第二行
mytable.rows[tabii].cells[tabjj].style.borderTop=curwidth+"px solid "+headbordercolor;
mytable.rows[tabii].cells[tabjj].style.borderLeft=curwidth+"px solid "+contentbordercolor;
break;
default:
//其它行
mytable.rows[tabii].cells[tabjj].style.borderTop=curwidth+"px solid "+contentbordercolor;
mytable.rows[tabii].cells[tabjj].style.borderLeft=curwidth+"px solid "+contentbordercolor;
break;
}
//特殊情况处理
//最后一行
if (tabii==mytable.rows.length-1) {
mytable.rows[tabii].cells[tabjj].style.borderBottom=curwidth+"px solid "+headbordercolor;
}
//每行的第一列
if (tabjj==0) {
mytable.rows[tabii].cells[tabjj].style.borderLeft=curwidth+"px solid "+headbordercolor;
}
//每行的最后一列
if (tabjj==mytable.rows[tabii].cells.length-1) {
mytable.rows[tabii].cells[tabjj].style.borderRight=curwidth+"px solid "+headbordercolor;
}
}
}
}

//------------------------处理鼠标调整表格大小操作------------------------
//本部分目前还存在如下缺陷:
//1、鼠标指向单元格边框后不进行任何操作时,鼠标将不能正常变化;
//2、装载需要控制的表格的容器不能放入其它对象内,但他的位置可以用绝对定位控制;
//3、当某列缩小到最小宽度(表头的宽度)后,只有鼠标位于该单元格的右上角时才能调整宽度;

//函数名称:downbody
//函数供能:在鼠标按下式定位竖线,并记录数线位置
//函数参数:无
//函数返回:无
function downbody() {
if (curstate==true) {
curdown=true;
/********************定位竖线********************/
mydiv.style.display="";
myline.style.height=mytable.offsetHeight;
myline.style.width=1;
//因其位于容器内,所以减去容器的左边距
mydiv.style.left=window.event.x+infocontent.scrollLeft-myline.offsetLeft-infocontent.offsetLeft;
mydiv.style.top=mytable.offsetTop-myline.offsetTop;
/************************************************/
oldplace=window.event.x+infocontent.scrollLeft;
}
}

//函数名称:movebody
//函数功能:
//鼠标位于表格之上并且鼠标已经按下则初始化直线的位置到该单元格的右
//边线位置并改变光标的形状
//函数参数:无
//函数返回:无
function movebody() {
if (curdown==true) {
//因其位于容器内,所以减去容器的左边距
mydiv.style.left=window.event.x+infocontent.scrollLeft-myline.offsetLeft-infocontent.offsetLeft;
mytable.style.cursor="images/cursor/splith.ico";
}
}

//函数名称:upbody
//函数功能:
//鼠标抬起时调整该列的宽度并隐藏直线同时改变光标的形状
//同时改变表格内容的宽度
//函数参数:无
//函数返回:无
function upbody() {
if (curstate==true) {
/********************调整表格********************/
//调整条件:(层左侧+线左侧=线绝对左侧坐标)>目标的左侧坐标+20
newplace=window.event.x+infocontent.scrollLeft;
if ((mydiv.offsetLeft+myline.offsetLeft)>curtable+window.document.body.all[curid].offsetLeft+20) {
//---------------表格内容的宽度改变---------------
var currentcolno; //取得列号
currentcolno=curid.substr(curid.lastIndexOf("_")+1);
var currenttextid; //取得每列的内容文本框的ID
currenttextid=currentcolno+"_text";
//将ID转换为Object型
currenttextid=MM_findObj(currenttextid);
//动态改变内容单元格的大小
for (i=0;i<currenttextid.length;i++) {
currenttextid[i].style.width=window.document.body.all[curid].width-(oldplace-newplace);
}
//-------------------------------------------------

//改变表格宽度
window.document.body.all[curid].width=window.document.body.all[curid].width-(oldplace-newplace);
mytable.width=mytable.width-(oldplace-newplace);
}
curstate=false;
curdown=false;
mydiv.style.display="none";
mytable.style.cursor="default";
/************************************************/
}
}

//函数名称:movecol
//函数功能:改变鼠标形状,并记录当前单元格的ID
//函数参数:
//mycolid,当前单元格的ID
//函数返回:无
function movecol(mycolid) {
//鼠标没有按下
if (curdown==false) {
if (window.event.x+infocontent.scrollLeft-infocontent.offsetLeft>curtable+window.document.body.all[mycolid].offsetLeft+window.document.body.all[mycolid].offsetWidth-3) {
curstate=true;
mytable.style.cursor="images/cursor/splith.ico";
} else {
curstate=false;
mytable.style.cursor="default";
}
curid=mycolid;
}
}
//------------------------鼠标调整表格大小操作结束------------------------

/*******************************公共区*******************************/
var curtable; //表格的左边距
curtable=mytable.offsetLeft;
var curstate; //记录鼠标的状态
var curdown; //记录鼠标按下
curdown=false;
var curid; //记录当前ID
var oldplace,newplace;

/*******************************调用区*******************************/
//装载改变宽度时的光标文件
MM_preloadImages("images/cursor/Splith.ico");
//初始化表格的边框
tableborderdisp("1","#000000","#c0c0c0");
</script>
</BODY>
</HTML>
------------------------------------------------------------------------
ghlfllz 2003-05-19
  • 打赏
  • 举报
回复
下面是程序的源程序:
------------------------------------------------------------------------
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<title>直接调整表格宽度</title>
</HEAD>
<BODY onselectstart="return false;" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div id="infocontent" onmouseup="upbody()" style="POSITION:absolute;width:603px; height:330px;left:40px;top:50px; z-index:1;overflow:scroll;">
<DIV Id=mydiv style="DISPLAY:none;HEIGHT:201px;LEFT:12px;POSITION:absolute;TOP:50px;WIDTH:28px;Z-INDEX:2;">
<hr Id=myline width="1" size="200" noshade Color="black">
</DIV>
<%
set conn=server.createobject("ADODB.connection")
conn.open "provider=microsoft.jet.oledb.4.0;data source="&server.mappath("database/db.mdb")
set rs=server.createobject("ADODB.recordset")
sql="select * from inroom"
rs.open sql,conn,1,3

Response.Write(buildtabledisp(rs,chs,"",300,"#ffffff","#ffffff","#000000","#000000",20,20,"","","","","center","left",100))

rs.Close
set rs=nothing
conn.Close
set conn=nothing

'函数名称:buildtabledisp
'函数功能:创建记录集的表格显示的HTML代码
'函数返回:endvalue,创建完成的HTML代码;
'函数参数:
'rs_tmp,记录集对象名;
'fieldnamelan,字段名文字的语言类型,取值分别为:EN,CHS;
'chslist,字段名为英文时,对应的字段名中文列表;
'tabwidth,表格宽度;
'tabbgcolor,表格背景颜色;
'thbgcolor,表头背景颜色;
'thcolor,表头文字颜色
'tdcolor,表格内容文字颜色;
'thheight,表头高度;
'tdheight,表格内容高度;
'tdlbgcolor,表格内容亮背景色;
'tddbgcolor,表格内容暗背景色;
'thfont,表头文字大小;
'tdfont,表格内容文字大小;
'thalign,表头对齐方式;
'tdalign,表格内容对齐方式;
'thwidth,表头宽度;
Function buildtabledisp(rs_tmp,fieldnamelan,chslist,tabwidth,tabbgcolor,thbgcolor,thcolor,tdcolor,thheight,tdheight,tdlbgcolor,tddbgcolor,thfont,tdfont,thalign,tdalign,thwidth)
dim endvalue,mystrlen
endvalue=""
mystrlen=0

endvalue=endvalue&"<table id=mytable border=0 cellspacing=0 cellpadding=0 bgcolor="&tabbgcolor&">"&vbcrlf
'表头
endvalue=endvalue&"<tr width='"&thwidth*rs_tmp.fields.count&"' id='myrows0' onmousedown='downbody()' onmouseover='movebody()'>"&vbcrlf
for i=0 to rs_tmp.fields.count-1
endvalue=endvalue&"<td width='"&thwidth&"' id='row0_mycols"&i&"' onmousemove="&chr(34)&"movecol('row0_mycols"&i&"')"&chr(34)&" height="&thheight&" bgcolor="&thbgcolor&" align="&thalign&">"&vbcrlf
endvalue=endvalue&"<input type=text style='background-color:transparent;border:0px solid #000000;font-size:12px;cursor:default;' readonly value="&rs_tmp.fields(i).name&" size="&lenb(rs_tmp.fields(i).name)-1&">"
endvalue=endvalue&"</td>"&vbcrlf
next
endvalue=endvalue&"</tr>"&vbcrlf
'内容
for i=0 to rs_tmp.recordcount-1
if not rs_tmp.eof and not rs_tmp.bof then
endvalue=endvalue&"<tr id='myrows"&i+1&"'>"&vbcrlf
for j=0 to rs_tmp.fields.count-1
'取的字段内容的精确长度
mystrlen=checkstring(rs_tmp.fields(j).value)
'处理内容显示框的长度,并进行容错处理
if mystrlen-1>10 then
mystrlen=10
elseif mystrlen-1=0 then
mystrlen=1
else
mystrlen=mystrlen-1
end if
endvalue=endvalue&"<td id='row"&i+1&"_mycols"&j&"'>"&vbcrlf
endvalue=endvalue&"<input type=text id='mycols"&j&"_text' size="&mystrlen&" value='"&rs_tmp.fields(j).value&"' style='background-color:transparent;border:0px solid #000000;font-size:12px;'>"&vbcrlf
endvalue=endvalue&"</td>"&vbcrlf
next
endvalue=endvalue&"</tr>"&vbcrlf
rs_tmp.movenext
end if
next
endvalue=endvalue&"</table>"&vbcrlf

buildtabledisp=endvalue
End Function

'**********************************************************
'◆ 函数名称:checkstring
'◆ 函数功能:获取字符串的长度
'◆ 函数参数:txt,要统计长度的字符串
'◆ 函数返回:y,字符串的长度
'◆ 函数调用:formatnum=checkstring("但程序12345678")
'**********************************************************
Function checkstring(txt)
txt=trim(txt)
x=len(txt)
y=0
for ii=1 to x
if asc(mid(txt,ii,1))<0 or asc(mid(txt,ii,1))>255 then
y=y+2 '是中文字符
else
y=y+1 '是英文字符
end if
next
checkstring=y
End Function
%>
</div>
possible_Y 2003-05-19
  • 打赏
  • 举报
回复
不错,重用性好是关键
bullion 2003-05-19
  • 打赏
  • 举报
回复
太多了,谁有心情看啊

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧