首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> ASP.NET教程
如何在DataGrid里面产生滚动条而不滚动题头-.NET教程,Asp.Net开发
作者:网友供稿 点击:78
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
我们在开发的时候一定遇到,使用datagrid的时候由于不想分页(数据没有那么多)但是又显示不在一页里面,此时我们希望在datagrid里面出现一个滚动条,可以上下滚动datagrid里面的数据而不用上下滚动页面,由于写本文的目的是为了说明如何实现,所以对于细节性的问题读者可以自己思考完成(比如:既要分页又要滚动等等)。为了可以滚动datagrid我们需要一个可以让客户端的table滚动js脚本(该js代码我是从codeproject上面下载的),但又不能滚动table的题头(也就是第一行)。我们都知道datagrid在解释到客户端以后将会生成一个table,但是这个table是由<tr><td>组成的,我们的脚本里面是需要使用到table的thead和tbody的(在大多数的客户端的应用中都要用到此功能比如:客户端的排序、以及列的托拽等等),因此我们接下来的任务就是如何为我们客户端的这个datagrid添加<thead><tbody>了。如果你对用户的自定义控件以及asp.net页面的原理有所了解,我们知道控件最后都是要呈现(render)在页面上的,因此我们可以重写这个方法来完成datagrid的自定义呈现。听一听真的有些吓人,那么复杂的控件怎么呈现?不要着急,首先我们创建一个自定义控件如下所示:
public class powerdatagrid : system.web.ui.webcontrols.datagrid
由此可以看出我们的控件是继承于datagrid的,所以我们现在的这个控件在不用写一行代码的情况下我们的这个控件已经具有datagrid的所有的功能。接下来我们要将我们准备的js代码内嵌到我们的控件里,好让放这个控件的页面上最终在客户端都会有这段js代码用来完成我们滚动的任务。为了完成这个工作我们要重写预呈现的方法:
protected override void onprerender(system.eventargs e) {

base.onprerender(e);

resourcemanager manager = new resourcemanager( this.gettype() );
resourceset resources = manager.getresourceset(system.globalization.cultureinfo.currentculture, true, true);
if( !page.isclientscriptblockregistered( "skysword.webcontrol.powerdatagrid library" ) ) {
string script = resources.getstring("scrolltable");
this.page.registerclientscriptblock("skysword.webcontrol.powerdatagrid library", script );
this.page.registerstartupscript("skysword.webcontrols.powerdatagrid init", "<script>makescrollabletable

("+this.id+",true,auto);</script>" );
}
}
在该方法中我们访问了资源文件。哦!忘了说我们还要建立一个资源文件,用来保存我们的js代码。我们首先将资源代码中对应scrolltable的数据(一段js脚本)注册到客户端的脚本块里。最后我们为了可以初始化,将<script>makescrollabletable("+this.id+",true,auto);</script>段脚本注册到页面加载时开始执行(我想就应该和body里面onload的方法一样吧)。当你需要加载客户端脚本的时候使用该方法是个不错的选择。好了,客户端脚本也有了,剩下的就是处理我们的客户端datagrid了(也就是datagrid呈现的客户端table)。为了可以呈现我们自己的datagrid我们需要重写呈现方法如下所示:
protected override void render(htmltextwriter output)
{
output.write(this.parsemarkup());
}
其中调用了一个parsemarkup的函数,改函数将产生一个输出的脚本(字符串),该脚本就是一个包含thead和tbody的table。由于此方法只是由该控件自己使用所以我们将它设置成私有的代码如下:
private string parsemarkup(){
// 插入thead标签和tbody标签
stringwriter writer = new stringwriter();
htmltextwriter buffer = new htmltextwriter(writer);
base.render(buffer);
string pmarkup = writer.tostring();

// 找到第一个table标签的结尾也就是第一个>字符
pmarkup = pmarkup.insert(pmarkup.indexof(">") + ">".length, "<thead>");
// 将第一个tr闭区间用thead包起来,现在第一个<thead>已经画出来了需要画
// 它的结尾</thead>和</tbody>,同样找到第一个</tr>来插入</thead>和</tdoby>
pmarkup = pmarkup.insert( pmarkup.indexof("</tr>") + "</tr>".length,"</thead><tbody>");
// 在最后一个</table>的前面插入一个</tbody>就可以了。
pmarkup = pmarkup.replace("</table>", "</tbody></table>");
return pmarkup;
}
在这个方法中我们首先实例化了一个stringwriter的对象writer,又用该对象为参数实例了一个htmltextwriter对象buffer,最关键的是我们调用了基类的render用来将buffer里面填满要输出的东西(一堆脚本就是table,如果你是用监视器查看里面的内容就可以看到)。好了剩下的工作就是分析这个脚本了,然后我们在该脚本第一个出现<tr>的地方将这个<tr>替换成<thead>和<tr>后面的替换方法类似。最后我们将这个被我们替换和修改的table输出到客户端,一切ok!

注意:用到stringwriter的原因就是它可以从buffer里面保存原始的字符比如:/t/n什么的。 资源文件的配置方法:首先给你的工程添加一个资源文件,名字和你的控件一样,然后在该文件中添加一下小节
<data name="scrolltable">
<value><![cdata[
<script language = javascript>

var container = new array();
var onresizehandler;

function scrollbarwidth(){
var w;

if (! document.body.currentstyle) document.body.currentstyle = document.body.style;

if (document.body.currentstyle.overflowy == visible || document.body.currentstyle.overflowy == scroll){
w = document.body.offsetwidth - document.body.clientleft - document.body.clientwidth;
}else{
win = window.open("about:blank", "_blank", "top=0,left=0,width=100,height=100,scrollbars=yes");
win.document.writeln(scrollbar);
w = win.document.body.offsetwidth - win.document.body.clientleft - win.document.body.clientwidth;
win.close();
}

return w;
}

function getactualwidth(e){
if (! e.currentstyle) e.currentstyle = e.style;

return e.clientwidth - parseint(e.currentstyle.paddingleft) - parseint(e.currentstyle.paddingright);
}

function findrowwidth(r){
for (var i=0; i < r.length; i++){
r[i].actualwidth = getactualwidth(r[i]);
}
}

function setrowwidth(r){
for (var i=0; i < r.length; i++){
r[i].width = r[i].actualwidth;
r[i].innerhtml = <span style="width: + r[i].actualwidth + ;"> + r[i].innerhtml + </span>;
}
}

function fixtablewidth(tbl){
for (var i=0; i < tbl.thead.rows.length; i++) findrowwidth(tbl.thead.rows[i].cells);
findrowwidth(tbl.tbodies[0].rows[0].cells);
if (tbl.tfoot) for (var i=0; i < tbl.tfoot.rows.length; i++) findrowwidth(tbl.tfoot.rows[i].cells);

//tbl.width = ;

for (var i=0; i < tbl.thead.rows.length; i++) setrowwidth(tbl.thead.rows[i].cells);
setrowwidth(tbl.tbodies[0].rows[0].cells);
if (tbl.tfoot) for (var i=0; i < tbl.tfoot.rows.length; i++) setrowwidth(tbl.tfoot.rows[i].cells);
}

function makescrollabletable(tbl,scrollfooter,height){
var c, pnode, hdr, ftr, wrapper, rect;

if (typeof tbl == string) tbl = document.getelementbyid(tbl);

pnode = tbl.parentnode;
fixtablewidth(tbl);

c = container.length;
container[c] = document.createelement(<span style="height: 100; overflow: auto;">);
container[c].id = tbl.id + "container";
pnode.insertbefore(container[c], tbl);
container[c].appendchild(tbl);
container[c].style.width = tbl.clientwidth + 2 * tbl.clientleft + scrollbarwidth();

hdr = tbl.clonenode(false);
hdr.id += header;
hdr.appendchild(tbl.thead.clonenode(true));
tbl.thead.style.display = none;

if (!scrollfooter || !tbl.tfoot){
ftr = document.createelement(<span style="width:1;height:1;clip: rect(0 1 1 0);background-color:transparent;">);
ftr.id = tbl.id + footer;
ftr.style.border = tbl.style.border;
ftr.style.width = getactualwidth(tbl) + 2 * tbl.clientleft;
ftr.style.borderbottom = ftr.style.borderleft = ftr.style.borderright = none;
}else{
ftr = tbl.clonenode(false);
ftr.id += footer;
ftr.appendchild(tbl.tfoot.clonenode(true));
ftr.style.bordertop = none;
tbl.tfoot.style.display = none;
}

wrapper = document.createelement(<table border=0 cellspacing=0 cellpadding=0>);
wrapper.id = tbl.id + wrapper;
pnode.insertbefore(wrapper, container[c]);

wrapper.insertrow(0).insertcell(0).appendchild(hdr);
wrapper.insertrow(1).insertcell(0).appendchild(container[c]);
wrapper.insertrow(2).insertcell(0).appendchild(ftr);

wrapper.align = tbl.align;
tbl.align = hdr.align = ftr.align = left;
hdr.style.borderbottom = none;
tbl.style.bordertop = tbl.style.borderbottom = none;

// adjust page size
if (c == 0 && height == auto){
onresizeadjusttable();
onresizehandler = window.onresize;
window.onresize = onresizeadjusttable;
}else{
container[c].style.height = height;
}
}

function onresizeadjusttable(){
if (onresizehandler) onresizehandler();

var rect = container[0].getclientrects()(0);
var h = document.body.clientheight - (rect.top + (document.body.scrollheight - rect.bottom));
container[0].style.height = (h > 0) ? h : 1;
}

function printpage(){
var tbs = document.getelementsbytagname(table);
var e;

for (var i=0; i < container.length; i++) container[i].style.overflow = ;

window.print();

for (var i=0; i < container.length; i++) container[i].style.overflow = auto;
}

</script>
]]></value>
</data>

好了,这样就可以完成了。使用该方法可以实现客户端的排序和托拽功能,只要你找到相应的js代码(或者自己写)然后使用此法分析你的客户端代码,最后将你的datagrid的输出定位成你想要的结果,一切就ok了!由于时间关系该控件分页和滚动不能同时,希望有兴趣的网友可以实现之。我在写此文章的目的旨在抛砖引玉的作用,希望对大家的编程技术有所提高和帮助。谢谢阅读!有什么问题或者好的建议请与我联系。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ASP.NET三层架构示例(中文版)-.NET教程,面向对象编程
·C#自定义控件制作篇-.NET教程,C#语言
·asp.net上传图片时,产生预览
·关于DataGrid 数据导入Excel乱码-ASP教程,数据库相关
·ado.net中数据库连接方式
·用asp.net(c#)连接oracle数据库的方法
·网页制作小技巧-ASP教程,ASP应用
·动态改变asp.net网页的标题
·asp.net中利用cookies保持客户端信息
·关于C#中switch语句的一点注意-.NET教程,C#语言
最新文章
·用vb.net 2005编写定时关机程序_vb/vb.net教程
·vb.net实现窗体图标最小化到状态栏_vb/vb.net教程
·如何提高google adsense单价:渠道篇_网赚技巧
·做百度主题推广的经验谈_网赚技巧
·解读电子商务规划关键词_站长心得
·手把手教你建立自己的网站_站长心得
·学网页设计与网页制作,你该做些什么?_站长心得
·写给新人的google排名知识_google推广
·google网络推广adwords帐户申请解析_google推广
·如何合理提高google adsense的收入_google推广
相关主题
  • 如何在DataGrid绑定之前为DataSet添加新列-.NET教程,数据库应用
  • 如何在DataGrid里面产生滚动条-.NET教程,数据库应用
  • 如何在DataGrid里面使用动态图形表示数字-.NET教程,数据库应用
  • 如何在DataGrid控件中隐藏列-.NET教程,Asp.Net开发
  • 如何在DataGrid控件中实现编辑、删除、分类以及分页操作-.NET教程,Asp.Net开发
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭