老杂毛博客
  青青子衿,悠悠我心。但为君故,沉吟至今。
博客首页 | 人生历程 | 编程开发 | 机关门  
  文章分类
 
博客首页 > 软件网络编程 > 文章正文

asp分栏代码详解,asp.net分栏代码详解

2011/3/3 13:42:01
 

前 言

         在众多网页所实现的功能中,分栏功能相比分页等等功能并不是很难,但是从我这几年来所看到的代码中,几乎没有找到一个特别满意的分栏代码,所以今天要公布一下自己的写法和大家共同分享,同时也想通过这篇文章让大家一起和我学习一下分栏是如何实现的。注意:本篇文章只适用于新手,如果你是老手的话就请绕过吧。

         在asp.net中分栏的方法变的多种多样,我们可以用一些前台控件来实现,如:DataList,Repeater等,但是我个人习惯在前台网页中一个控件都不用,因为这样会产生很多杂代码,从而影响页面传输速度。所以今天借这篇文章把asp和asp.net中的分栏代码都详细的讲解一下。

         我开始会先用asp做一些小例子,最后会把我现在用的分栏代码写出来,然后补充一下asp.net的代码,相信会C#的朋友asp代码也应该是能看懂的。

asp常用分栏方法

       比如我现在某一个页面的列表页需要实现分栏功能,那么代码如下:

 set rst=server.CreateObject("adodb.recordset")
 sql="select * from Information where itemid="&itemid
 rst.open sql,conn,1,3

      先用如上代码将数据调出,然后循环输出:

  Response.Write("#lt;table#gt;")
  do while not rst.eof
    Response.Write("#lt;tr#gt;#lt;td#gt;"&rst("infotitle")&"#lt;/td#gt;#lt;/tr#gt;")
  rst.movenext
  loop
  Response.Write("#lt;/table#gt;")

     这样的代码我们全都看得懂,只是顺序把内容输出了而已,那么我现在要分两栏把内容输出如何来做呢,代码如下:

 Response.Write("#lt;table border=""1""#gt;#lt;tr#gt;")
  dim cols
  cols=0
  do while not rst.eof
  cols=cols+1
  Response.Write("#lt;td#gt;"&rst("info_title")&"#lt;/td#gt;")
  if (cols mod 2)=0 then
  Response.Write("#lt;/tr#gt;#lt;tr#gt;")
  end if
  rst.movenext
  loop
  Response.Write("#lt;/table#gt;")

分栏效果如图:


分栏原理讲解:在顺序输出的代码中我们是循环一个table的行,一行一行的显示数据,但是在分栏的时候我们需要为每一行增加一列,这时候我们就不能在每一次输出的时候都加上#lt;/tr#gt;这个行的返回标记了,我们需要有选择性的换行,所以我们先定义了一个变量来记录当前所循环的行数cols,每循环一次使他的值加1,然后这里利用了mod这个指令,他的功能是取余数,用当前的记录数除以分栏数得到的余数如果为0,那么说明正好被整除,这样我们就需要打出一个换行标记,如果不能被整除,那么继续输出td(单元格标记)。所以我们在循环里所加入的判断是以分栏数为终点,一旦到达这个终点便输出一个换行标记,并且再输出一个下一行的起始标记#lt;tr#gt;。

注意:我们可以不用mod,在每次判断的时候把cols重新置为0,然后if的时候判断cols是否和分栏数相等也是可以实现该功能的,代码如下:

  Response.Write("#lt;table border=""1""#gt;#lt;tr#gt;")
  dim cols
  cols=0
  do while not rst.eof
  cols=cols+1
  Response.Write("#lt;td#gt;"&rst("info_title")&"#lt;/td#gt;")
  if cols= 2 then
  Response.Write("#lt;/tr#gt;#lt;tr#gt;")
  cols=0
  end if
  rst.movenext
  loop
  Response.Write("#lt;/table#gt;")

稍加完美的asp分栏代码

  细心的朋友可以发现一个问题,虽然上面的代码确实是实现了分栏,但是我们在检查html代码的时候会发现最后一行会多出一个#lt;tr#gt;标签来,而这个标签之后就直接是#lt;/table#gt;。

#lt;/td#gt;#lt;/tr#gt;#lt;tr#gt;#lt;/table#gt;

这显然是不符合html的开闭原则的,不过现在的浏览器识别能力都很强,竟然把这个错误给忽略了,表格照常显示,但是做为一个优秀的程序员是不允许犯这种错误的,而且有的时候这种错误还有可能造成搜索引擎无法正常分析页面结构,所以我们决定把代码再次改装一下:

  Response.Write("#lt;table border=""1""#gt;#lt;tr#gt;")
  dim cols
  cols=0
  do while not rst.eof
  cols=cols+1
  Response.Write("#lt;td#gt;"&rst("info_title")&"#lt;/td#gt;")
  if (cols mod 2)=0 then
  Response.Write("#lt;/tr#gt;")
     if cols#lt;#gt;rst.RecordCount then
      Response.Write("#lt;tr#gt;")
     end if
  end if
  rst.movenext
  loop
  Response.Write("#lt;/table#gt;")

 我们在原来的代码基础上增加了一个判断:

     if cols#lt;#gt;rst.RecordCount then
        Response.Write("#lt;tr#gt;")
     end if

判断如果当前不是最后一条记录,那么我们就输出#lt;tr#gt;这个标记新起一行,如果是最后一行,那么我们就不输出这个标记了,下面看一下效果:

细心的朋友们会发现这个表格会比上面的少了下现的一个小边框,没错,上面的那个效果之所以有一个小边框就是因为最后的#lt;tr#gt;无法识别所造成的,这样看起来我们的分栏功能算是很完美了,但是紧接着我们又发现了另一个问题,假如我们所要显示的数据不能被分栏数整除,也就是说假如你需要分两栏,而你的数据是9条,那么这个表格会变成什么样呢。如下图:

这时候我们查看源代码后发现,最后一行竟然没有结束标记#lt;/tr#gt;而是在#lt;/td#gt;之后直接#lt;/table#gt;了,那么如何来解决这个问题呢,我们不妨把增加#lt;/tr#gt;的判断稍加修改一下,代码如下:

  Response.Write("#lt;table border=""1""#gt;#lt;tr#gt;")
  dim cols
  cols=0
  do while not rst.eof
  cols=cols+1
  Response.Write("#lt;td#gt;"&rst("info_title")&"#lt;/td#gt;")
  if (cols mod 2)=0 then
  Response.Write("#lt;/tr#gt;")
         if cols#lt;#gt;rst.RecordCount then
      Response.Write("#lt;tr#gt;")
      end if
  end if
  if cols=rst.RecordCount then
   Response.Write("#lt;/tr#gt;")
  end if
  rst.movenext
  loop
  Response.Write("#lt;/table#gt;")

这时候我们发现那个遗失的#lt;/tr#gt;已经又补回来了。

#lt;/td#gt;#lt;/tr#gt;#lt;/table#gt;

更加完美的asp分页代码

也许看到上面的代码,你会认为这样就很完美了吧,是的,我们之前的分栏代码都是这样写的,但是昨天我在为我的小说机关门调数据的时候发现,最后一行只输出了一个单元格,这样也是不符合表格的输出规则的,因为所有的行必须都是同样的列,想要跨多列我们需为单元格加上跨列属性:colspan,但是显然我们最后的一列又不是需要跨列的,只是没有数据了而已,那么这时候我为代码做了新的改近,以达到我认为这是我做分栏功能里接近完美的做法,那就是空列补齐法,代码如下:

   Response.Write("#lt;table border=""1"" width=""500""#gt;")
    Response.Write "#lt;tr#gt;"
    dim cols,torows
    cols=0
  if (rst.RecordCount mod 5)=0 then
    torows=rst.RecordCount '' 若正好是分栏的倍数则不进行增量计算
  else
       torows=rst.RecordCount+(5-(rst.RecordCount mod 5))
  end if
 
 for i=1 to torows step 1
 cols=cols+1
 
 if i#gt;rst.RecordCount then
  Response.Write "#lt;td#gt; #lt;/td#gt;"
 else
  Response.Write"#lt;td#gt;"&rst("Info_Title")&"#lt;/td#gt;"
  rst.movenext
 end if
    if (cols mod 5)=0 then
  Response.Write "#lt;/tr#gt;"
  if i#lt;#gt;torows then
    Response.Write "#lt;tr#gt;"
 end if
 cols=0  
 end if
    next
  Response.Write("#lt;/table#gt;")

为了更能说明问题,我把两栏给改成了5栏,效果如下图:

我们可以清楚的看到后面的两个空列已经被补齐了,那么我是如何做到的呢。

更加完美的asp分栏代码讲解:我心里竟然想着把“更加”两个字换成“近乎”因为我真的想不出来这个代码还有什么缺点了,但是天下没有完美的程序,所以我还是用更加两个字来形容一下。

在上面的代码中,大家可以看到我把do while循环给改成了for循环,因为这样做我可以很好的控制循环次数,其原理就是我在总数的基础上找到最接近分栏数且大于总数的分栏公倍数,比如我现在有十八条信息,那么18介于15和20之间,我选择循环20次,中间在加判断,若记录已经读取完毕则在最后补充空单元格,这样这个分栏就看起来很完美了,经过我这样的讲解不知道大家明白了没有呢。

asp.net分栏代码详解

这个分栏的原理我在上面已经讲的很详细了,相信你只要稍微有一点代码基础应该就可以看得懂了,那么我现在就把以上的asp代码,翻译成C#的代码再发布出来一份以供asp基础不太好的C#程序员使用:

假如数据我们已经读取到了DataTable中了,代码如下:

        StringBuilder infoStr = new StringBuilder();
        infoStr.Append("#lt;table border=\"1\" width=\"500\"#gt;#lt;tr#gt;");
        int cols=0;
        int torows=0;
        if ((dt.Rows.Count % 5) == 0)
        {
            torows = dt.Rows.Count;
        }
        else
        {
            torows = dt.Rows.Count + (5 - (dt.Rows.Count % 5));
        }
        for(int i=0;i#lt;torows;i++)
        {
            cols++;

            if (i#gt;=dt.Rows.Count)
            {
                infoStr.Append("#lt;td#gt; #lt;/td#gt;");
            }
            else
            {
                infoStr.Append("#lt;td#gt;" + dt.Rows[i]["fName"].ToString() + "#lt;/td#gt;");
            }

            if ((cols % 5)==0)
            {
                infoStr.Append("#lt;/tr#gt;");
          if ((i+1)!=torows)
                {
                    infoStr.Append("#lt;tr#gt;");
                }
           cols=0;
         }

        }
        infoStr.Append("#lt;/table#gt;");
        Response.Write(infoStr.ToString());

OK,此代码经过我测试完全没有问题,请初学者记住在C#中字符串的拼装请尽量用StringBuilder,这样要比string的相加快很多,最后输出这个字符串就可以了。

总 结:

       分栏功能的实现我就讲这么多,如果哪位认为我这个还有问题,可以留言告诉我,如果你在看我的代码过程中有哪些不理解的,也可以留言告诉我,本文作者老杂毛版权没有,转载不究,如果你有不同的意见,你全是对的,就说这么多吧,如果你感觉这篇文章帮到了你,别忘了留个言也没有枉费我花费了这么长吃饭时间来整理文章了。

阅读: (2472)  评论(8)  
 
网友评论:
 
 1.124.126.227.2162011/3/3 14:04:12 
近乎完美的分栏代码,写的真的不错,支持了。
天哥的文章都很好,顶。
 2.深圳律师2011/3/3 22:08:43 
大哥专业

 3.121.41.128.1622011/3/11 10:45:29 
很好。。学习
 4.218.242.250.262011/3/16 13:32:48 
棒槌
 5.2016/6/13 7:52:42 
 6.2016/6/16 22:32:20 
 7.2016/6/26 1:36:30 
 
相关文章:
 微信支付asp.net V3.3.7 sys
 ERRORLOG 文件太大的处理办法
 Attempted to read or w
 Ctrl键自动按下,Ctrl键和Alt总感觉
 解决 Your project contai
 adb install 多设备id号一样,如
 如何去掉优酷,土豆等网站的广告?
 webview的loadData方法加载乱码
 让iis7支持apk文件下载
 sql利用游标循环,遍历表循环结果集
 
 
     
联系作者: QQ: 657603425 Email: 657603425@qq.com
Copyright © 2007-2014 www.laozamao.com All Rights Reserved
京ICP备09002242号 北京海淀分局备案号:1101084842