分享
 
 
 

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

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在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- 王朝網路 版權所有