分享
 
 
 

客户端实现类似于DataGrid的输入表格控件

王朝html/css/js·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

客户端实现类似于DataGrid的输入表格控件

客户端实现类似于DataGrid的输入表格控件 在aspx中,当使用DataGrid提交数据时,客户每输入一条记录,就会向服务端提交一次数据,所以当提交数据较多时,效率就会很低,如果在客户端将这些数据'打包',再上传到服务端,这样就可以一次上传多条数据。 所以基本思路就是在客户端获取所有的输入数据,将数据转换成以逗号分隔的字符串,将字符串传到服务器,在服务端将字符串拆成数组(用split函数),再写入数据库中。所有,提交到服务器只有一次。 这个控件还有一些缺陷:删掉一行数据时,可能使IE死掉。 只能在写在网页中,不能写成js文件后再引用,可能是代码中包含了window.alert方法,我想这个问题是可以解决的,如果有哪位高手解决了,麻烦通知一下,谢了。还有一个解决方法,将代码写成inc文件,代码用<script>.....</script>,再引用:<!-- #include virtual='../script/ClientDataGrid.inc'>,这样运行时,代码就会自动加到网页上。 这个控件的功能都写再备注里,大家也可以扩展一些功能。如果有哪位高手作了改进请一定通知一下,谢了。

代码如下:

<script language='javascript'>

/// 客户端DataGrid

/// Author : Curllion Zhang

/// 2005-7-29

//-----------------------------------表格对象-------------------------------------------

//注意:

// 1、创建该对象时,一定要设定对象的ID值为此象的ID

// 2、如果指定了单元格的CSS,则被选中的行的CSS不起作用

//

function ClientDataGrid(ColCount,TitleRow,TitleRowHeigh,RowHeight,ColWidths,PostCols,InputCols,TextBoxs,Parent)

{

this.ColCount = ColCount; //列数量

this.TitleRow = new Array(ColCount); //表格标题

this.TitleRowHeigh = TitleRowHeigh; //表格标题的行高

this.RowHeight = RowHeight; //行高

this.ColWidths = new Array(ColCount); //表示列宽的数组,单位px

this.Cellspacing; //单元格间格

this.Cellpadding; //单元格空白

this.Border; //边框

this.Width; //控件宽度

this.Height; //控件高度

this.BorderColor; //表格边框颜色,文本

this.CSS; //指定CSS,文本

this.TitleCSS; //指定标题CSS

this.TitleItemCSS; //指定标题单元格的CSS

this.RowCSS; //指定行的CSS

this.ItemCSS; //指定单元格CSS,如果指定了单元格的CSS,则被选中的行的CSS不起作用

this.SelectedCSS; //被选定行的CSS

this.PostCols = new Array(ColCount); //数组,表示当前要上传的列,如果是1,则表示要上传

this.InputCols = new Array(ColCount); //数组,表示当前要上传的列,如果是1,则表示要输入

if(TextBoxs == null)

this.TextBoxs = null;

else

{

//与此类关联的input控件,数据将会从此控件中提交

this.TextBoxs = new Array(TextBoxs.length);

for(var i = 0; i< TextBoxs.length ;i++)

{

this.TextBoxs[i] = TextBoxs[i];

}

}

this.SelectedIndex = -1; //选择索引,-1表示没有行被选中

this.DeleteEnable = true; //是否显示删除按钮

this.RowCount = 0; //行数

this.Rows = new Array(); //行集合

this.Parent = Parent; //此控件的父控件

this.ID='dg'; //本控件的ID

for(var i = 0; i< ColCount;i++)

{

if(ColWidths == null)

this.ColWidths[i] = 60; //指定默认行高为60,也可以用字符串指定为百分数

else

this.ColWidths[i] = ColWidths[i];

this.TitleRow[i] = TitleRow[i];

if(PostCols == null)

this.PostCols[i] = 0; //默认是没有列要上传

else

this.PostCols[i] = PostCols[i];

if(InputCols == null)

this.InputCols[i] = 0; //默认是没有列要上传

else

this.InputCols[i] = InputCols[i];

}

}

//画出表格

ClientDataGrid.prototype.Draw = function(ID)

{

this.ID=ID;

var str = '<table rules='all' id = '' + ID + '_datagrid' ' +

(this.Border !=null?('border=' + this.Border):'') + ' ' +

(this.Cellspace !=null?('cellspace=' + this.Cellspace):'') + ' ' +

(this.Cellpadding !=null?('cellpadding=' +this.Cellpadding):'') + ' ' +

(this.Width !=null?('width=' + this.Width):'') + ' ' +

(this.Height !=null?('height=' + this.Height):'') + ' ' +

(this.BorderColor !=null?('bordercolor=' + this.BorderColor):'') + ' ' +

(this.CSS !=null?('style='' + this.CSS + '''):'') + '>';

//画标题

str = str + '<tr ' + (this.TitleCSS!=null?('style='' + this.TitleCSS + '''):'') + '>';

for(var i = 0;i<this.ColCount;i++)

{

str = str + '<td ' + (this.ColWidths[i]!=null?('width=' + this.ColWidths[i]):'') + ' ' +

(this.TitleItemCSS!=null?('style='' + this.TitleItemCSS + '' '):'') + '>' + this.TitleRow[i] + '</td>';

}

str = str + '<td ' + (this.TitleItemCSS!=null?('style='' + this.TitleItemCSS + '' '):'') + '>选中</td>';

str = str + '<td ' + (this.TitleItemCSS!=null?('style='' + this.TitleItemCSS + '' '):'') + '>删除</td>';

str = str + '</tr>' ;

//画单元格

for(var i = 0 ; i < this.RowCount; i++)

{

str = str + '<tr id = 'row'+ i + '' ' + (this.RowHeight!=null?('height=' + this.RowHeight):'') + ' ' +

(this.RowCSS!=null?('style='' + this.RowCSS + '''):'') + '>';

for(var j=0;j<this.ColCount;j++)

{

if(this.InputCols[j] == 1)

str = str + '<td ' + (this.ItemCSS!=null?('style='' + this.ItemCSS + '' '):'') + '><input language='javascript' type=text value='' + this.Rows[i].Data[j] + '' onblur=''+this.ID+'.CellChange('+j+','+i+',this.value)'></td>';

if(this.InputCols[j] == 0)

str = str + '<td ' + (this.ItemCSS!=null?('style='' + this.ItemCSS + '' '):'') + '>' + this.Rows[i].Data[j] + '</td>';

}

str = str + '<td ' + (this.ItemCSS!=null?('style='' + this.ItemCSS + '' '):'') + '><input language='javascript' type=button value='选中' onclick='' + this.ID + '.SelectRow(' + i + ')'></td>';

str = str + '<td ' + (this.ItemCSS!=null?('style='' + this.ItemCSS + '' '):'') + '><input language='javascript' type=button value='删除' onclick='' + this.ID + '.DeleteRowAt('+ i + ')'></td>';

str = str + '</tr>';

}

str = str + '</table>';

this.Parent.innerHTML = str;

//写到TextBoxs中

var k = 0;

for(var j=0;j<this.ColCount;j++)

{

if(this.PostCols[j] == 0)

continue;

tmp = '';

for(var i=0;i<this.RowCount;i++)

{

tmp = tmp + this.Rows[i].Data[j] + ',';

}

this.TextBoxs[k].value = tmp.substr(0,tmp.length-1);

k++;

}

}

//在指定位置插入一行

ClientDataGrid.prototype.InsertRowAt = function(index,dataRow)

{

tmpRows = this.Rows.slice(0,index).concat(new Array(dataRow)).concat(this.Rows.slice(index,this.RowCount+1));

this.Rows = tmpRows;

this.RowCount++;

this.SelectedIndex = -1;

}

//在指定位置插入多行

ClientDataGrid.prototype.InsertRowsAt = function(index,dataRows)

{

tmpRows = this.Rows.slice(0,index).concat(dataRows).concat(this.Rows.slice(index,this.RowCount+1));

this.Rows = tmpRows;

this.RowCount = this.RowCount + dataRows.length;

this.SelectedIndex = -1;

}

//在最后面插入一行

ClientDataGrid.prototype.InsertRow = function(dataRow)

{

this.Rows = this.Rows.concat(new Array(dataRow))

this.RowCount++;

}

//再最后面插入多行

ClientDataGrid.prototype.InsertRows = function(dataRows)

{

this.Rows = this.Rows.concat(dataRows);

this.RowCount = this.RowCount + dataRows.length;

this.SelectedIndex = -1;

}

//选中一行

ClientDataGrid.prototype.SelectRow = function(index)

{

this.SelectedIndex = index;

//因为标题行不算,所以从1开始

for(var i = 1 ;i<=this.RowCount ;i++)

{

var tmpCSS = '';

if(i==this.SelectedIndex + 1)

{

if(this.SelectedCSS != null)

tmpCSS = 'window.document.all(\'' + this.ID + '_datagrid\').rows(' + i + ').style.cssText=''+ this.SelectedCSS +''';

else

tmpCSS = 'window.document.all(\'' + this.ID + '_datagrid\').rows(' + i + ').style.cssText=''';

}

else

{

if(this.RowCSS != null)

tmpCSS = 'window.document.all(\'' + this.ID + '_datagrid\').rows(' + i + ').style.cssText=''+ this.RowCSS +''';

else

tmpCSS = 'window.document.all(\'' + this.ID + '_datagrid\').rows(' + i + ').style.cssText=''';

}

eval(tmpCSS);

}

}

//更改表格的值

ClientDataGrid.prototype.CellChange = function(x,y,value)

{

//先改变对象的值

this.Rows[y].Data[x] = value;

//写到TextBoxs中

var k = 0;

for(var j=0;j<this.ColCount;j++)

{

if(this.PostCols[j] == 0)

continue;

tmp = '';

for(var i=0;i<this.RowCount;i++)

{

tmp = tmp + this.Rows[i].Data[j] + ',';

}

this.TextBoxs[k].value = tmp.substr(0,tmp.length-1);

k++;

}

}

//删除指定位置的行,如果删除过快,就IE就会死掉,所以放用户确认一下,并且再重绘时,先清掉,防止宕掉

ClientDataGrid.prototype.DeleteRowAt = function(index)

{

if(confirm('确认要删除吧?'))

{

this.Parent.innerHTML = '';

this.SelectedIndex = -1;

if(index < 0 || index >= this.RowCount)

{

window.alert('指定的位置没有行');

return;

}

tmpRows = this.Rows.slice(0,index).concat(this.Rows.slice(index+1,this.RowCount));

this.Rows = tmpRows;

this.RowCount--;

//eval('window.document.all(\'' + this.ID + '_datagrid\').deleteRow(' + index + ');')

this.Draw(this.ID);

}

}

//-----------------------------------行对象------------------------------

function DataRow(Data)

{

this.ItemCount = Data.length; //一行的元素个数

this.Data = new Array(); //记录数据

for(var i = 0 ;i<this.ItemCount ;i++)

{

this.Data[i] = Data[i];

}

}

</script>

如何使用,例如

<script language='javascript'>

var textBoxs = new Array(document.Form1.pfy ,document.Form1.presult);

var colWidths = new Array('80px','180px',null);

var dg = new ClientDataGrid(3,new Array('代码','费用类型','金额'),25,25,colWidths,new Array(1,0,1),new Array(0,0,1),textBoxs,document.all('fylist'));

dg.Width = 455;

dg.CSS = 'background-color:White;border-color:#CC9966;border-width:1px;border-style:None;border-collapse:collapse;';

dg.TitleCSS = 'color:#FFFFCC;background-color:#990000;font-weight:bold;';

dg.BorderColor = '#CC9966';

dg.SelectedCSS = 'color:#663399;background-color:#FFCC66;';

dg.Draw('dg');

//这是插入代码,大家可以改成其它的,看看是不是和DataGrid的第一种样式一样呀

function B_insert_onclick()

{

var tmpRows = new Array();

for (i = 0 ;i < Form1.LBExpenss.length ;i ++)

{

if(Form1.LBExpenss.options[i].selected)

{

tmpRows = tmpRows.concat(new Array(new DataRow(new Array(Form1.LBExpenss.options[i].value,Form1.LBExpenss.options[i].text,''))));

}

}

if(dg.SelectedIndex != -1)

dg.InsertRowsAt(dg.SelectedIndex,tmpRows);

else

dg.InsertRows(tmpRows);

dg.Draw('dg');

}

</script>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有