posts - 5,comments - 3,trackbacks - 0

最近写一个页面需要让GridView默认显示最后一页,在CSDN上问了一下,好多人都说用

 

1 if (!IsPostBack)
2         {
3             GridView1.DataBind();
4             GridView1.PageIndex = GridView1.PageCount;
5         }

这样来写,可是实践中发现这样写并不能达到预期的效果,默认仍然显示第一页,只是在点击任意一个翻页后跳到最后一页,而CSDN上有朋友还强调一定要在DataBind()后做页码设定.

后来在MSDN中文论坛上发帖求助才得以解决.

一定要在DataBind()之前设定页码,PageCount也不要用,绑定之前PageCount默认是0,在这里要手动写一个计算页码的方法

 

 

 

 1 private int pageNum()
 2     {
 3         DataSet ds=new DataSet();
 4         SqlDataAdapter da = new SqlDataAdapter(查询,连接);
 5         da.Fill(ds);
 6         int totnum;
 7         int num=ds.Tables[0].Rows.Count;
 8         if (num % 10 == 0)
 9         {
10             totnum = num / 10;      //如果能整除就是正好能分整页
11         }
12         else
13         {
14             totnum = num / 10 + 1;  //如果有余数就是余下的行分在一个新页中
15         }
16 
17         return totnum;
18     }

 

DataBind()之前加上GridView1.PageIndex = pageNum();

 

既然有分页,肯定要有换页的代码,这个GridView1.PageIndex = pageNum();我写在了绑定数据的方法里,那么在protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)中,换页后绑定数据就不能在用这个绑定方法了,否则每次换页都只能显示最后一页,可以在写一个绑定方法,去掉GridView1.PageIndex = pageNum();这一句,然后给PageIndexChanging事件来用

posted @ 2008-09-10 13:50 FrostX 阅读(110) | 评论 (0)编辑
返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加的一个东东,一般这种功能的实现在ASP.net中都是用一个button的控件来实现的,实现的方法有很多,今天恰好在做项目时碰到要用这个东东,我就把能实现" 返回上一页","返回前一页"的几种方法总结了一下,供大家学习之用,请多多指教:0)

其实要实现这个功能主要还是要用到javascript

方法一:
 在asp.net的aspx里面的源代码中
<input type="button onclick="javascript:window.history.go(-1);"value="返回上一页">

浅析:这个是用了HTML控件,通过一个onclick的事件,调用了javascript中的一个方法就可以了。这个是最简单的了,也同样适用于静态页面,ASP页面等。

方法二:

利用Reponse.write
如果你对ASP有一定的了解,那么对Response.write这个东东就不会陌生了,方法一是直接有HTML页面中实现,则这个则是在后台环境中实现(这个说法好像不是很规范,呵呵)

Response.write("<script language=javascript>history.go(-2);</script>)

<a   href="#"   onclick="javascript:history.back();">返回前一页</a>


这里为会么要采用-2的值呢,我个人认为是这样的:因为在asp.net中的页面,当你按下一个button后,由于页面中会实现page.postback的缘故,实际上在这其中是刷新了两次页面,我们要的是第一次的,所以就......


方法三

利用Response.Redirect() 或 server.transfer()


在page_load中加入
if(!IsPostBack)   
        ViewState["retu"]=Request.UrlReferrer.ToString();   
    
而在在返回按钮事件中   
  Response.Redirect(ViewState["retu"].ToString());   
  或Server.Transfer   (ViewState["retu"].ToString());   


浅析:
Request.UrlReferrer可以获取客户端上次请求的url的有关信息,我们在使用这个的时候最好对其进行一个判断

if(ViewState["UrlReferrer"]!=null)

        Response.Redirect(ViewState["UrlReferrer"].ToString();

else
{
Response.write("对不起,当前是最前页码“);


这样才好使一点点喔
}

以下这段来自:http://stswordman.cnblogs.com/archive/2006/06/12/423910.html
在使用Request.UrlReferrer时还要注意: 
1.  如果上一页面使用document.location方法导航到当前页面,Request.UrlReferrer返回空值
2.  如果有A,B两个页面,在浏览器中直接请求A页面,在A页面的中Page_Load事件中导航到B 页面,则    Request.UrlReferrer返回空。因为 在Page_load事件中页面还未初始化,所以无法记录当前页的信息,导航到b页面也就无法获得上一页面的信息   
3.  点击刷新按钮不会改变Request.UrlReferrer 



方法四:

这个方法估计很少人用,不过我试了一下,也还很不错喔

在button的onClick事件中输入

this.RegisterClientScriptBlock("e", "<script language=javascript>history.go(-2);</script>");

一样可以 返回到上一页


方法五

<a href=<%=request.servervariable("http_Referre)%>

<asp:image id="imageback" visible = true" imagurl="上一页" runat="server"/></a>


这里还要啰嗦一下用Javascript来实现与用Response.redirect()来实现的一点点区别,如果你是用天表单的时候想保留你填的数据,那就要用history.go();这个东东,如果你只是直接返回不用做任何操作,你就可以用reponse.redirect()了.  
posted @ 2008-08-20 13:00 FrostX 阅读(221) | 评论 (2)编辑

昨天先在台式机上升级了,环境是Vista U中文版 VS2008中文版,升级完装的SQL2008,全都没有问题

然后在笔记本上升级,笔记本上是Vista U英文版 VS2008中文版,结果全部升级完(也装完SQL2008)之后,再打开以前的项目,就发生"包加载失败"的问题,而且VS2008中很多标签都变为英文的了..在网上搜了一下,好多人发表的有关"包加载失败"的解决办法,好像全都是复制自同一个地方的,而且也都是针对2005的,不管是什么环境变量..建立XML,我都试过仍然不行,还有复制那个DLL文件.发现VS2008不存在那个DLL文件.

目前还没找到解决办法..可能是因为操作系统语言的问题.SP1升级程序判断系统语言为英文,就升级英文版SP1,结果VS环境是中文...

不知道有没有人碰到一样的问题..

posted @ 2008-08-14 13:49 FrostX 阅读(208) | 评论 (0)编辑
忙了2个下午,终于解决了不操作XML文件,通过编程动态修改SiteMap中节点的问题,msdn上的例子不是很好,自己研究了一下,在此感谢在msdn和csdn帮助我的朋友.SiteMap当中首先肯定要加入固定的节点,我的论坛只有Forum.aspx,Topic.aspx和Post.aspx3个页面,Forum.aspx显示大分类和在大分类下面的小板块,Topic.aspx显示每个小板块中的帖子,Post.aspx显示帖子和回复内容.一共有3个参数,ForumID,TopID,PostID,分别存于数据库中,用于标识各个记录,类型为Guid.3个页面url格式一般为forum.aspx,Topic.aspx?ForumID=xxx&TopID=xxx,Post.aspx?ForumID=xxx&TopID=xxx&PostID=xxx
在SiteMap中写入固定节点:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
3     <siteMapNode url="Forum.aspx" title="FLT Forum"  description="">
4         <siteMapNode url="Topic.aspx" title="帖子列表"  description="" >
5           <siteMapNode url="Post.aspx" title="查看帖子"  description="" />
6         </siteMapNode>
7     </siteMapNode>
8 </siteMap>
基本上这个只标识一下网站结构
在master页的page_load中注册事件:
1 protected void Page_Load(object sender, EventArgs e)
2     {
3         if (!IsPostBack)
4         {
5            SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ForumPath);
6         }
7     }
事件处理代码:
SiteMapNode ForumPath(object sender, SiteMapResolveEventArgs e)
    
{
        SiteMapNode currNode 
= SiteMap.CurrentNode.Clone(true);//克隆当前节点,true表示克隆所有父节点
        SiteMapNode tempNode = currNode;

        
string strClassName = "";//论坛分类名,这个最后我没用上,不过要使SiteMap更人性化的话,加上还是好一些.
        string strTopName = "";  //板块名
        string strPostTitle = "";//帖子主题

        
string strForumID = getForumID(out strClassName);//3个方法后面我会提到
        string strTopID = getTopID(out strTopName);
        
string strPostID = getPostID(out strPostTitle);

        
if (strForumID != "" && strTopID != "")//因为结构很简单,只有3层,当ForumID和TopID同时存在于url参数中的时候必然是帖子列表
        {
            tempNode.Title 
= strTopName;//设定帖子列表节点的title

            
if (strForumID != "" && strTopID != "" && strPostID != "")//当3个参数同时存在的时候,当前位置肯定是帖子内容
            {
                
if ((tempNode = tempNode.ParentNode) != null)//将父节点存为当前节点
                {
                    tempNode.Url 
= tempNode.Url + "?ForumID=" + strForumID + "&TopID=" + strTopID;//设定当前节点(帖子内容的父节点就是帖子列表)的url
                    tempNode.Title = strTopName;设定帖子列表的title
                    tempNode.ChildNodes[
0].Title = strPostTitle;设定帖子内容的title
                }



            }

        }


        
return currNode;//返回节点
    }

下面是3个方法,返回ForumID,TopID,PostID3个参数
 1 private string getForumID(out string strClassName)
 2     {
 3         string strForumID = "";
 4         if (System.Web.HttpContext.Current.Request.QueryString["ForumID"!= null)//这里必须要写System.Web.HttpContext.Current.Request.QueryString,而不能直接写Request.QueryString,这个问题在csdn上很长时间没解决啊,后来在msdn上一位朋友指点.
 5         {
 6             strForumID=System.Web.HttpContext.Current.Request.QueryString["ForumID"].ToString();
 7             strClassName = xxx;//通过数据库或者Dataset获取分类名
 8             return strForumID;
 9         }
10         else
11         {
12             strPartName = "";
13             return strForumID;
14         }
15 
16     }
17 
18 private string getTopID(out string strTopName)
19     {
20         string strTopID = "";
21 
22         if (System.Web.HttpContext.Current.Request.QueryString["TopID"!= null)
23         {
24             strTopID = System.Web.HttpContext.Current.Request.QueryString["TopID"].ToString();
25             strTopName = xxx;//同上
26             return strTopID;
27         }
28         else
29         {
30             strTopName = "";
31             return strTopID;
32         }
33     }
34 
35 private string getPostID(out string strPostTitle)
36     {
37         string strPostID = "";
38 
39         if (System.Web.HttpContext.Current.Request.QueryString["PostID"!= null)
40         {
41             strPostID = System.Web.HttpContext.Current.Request.QueryString["PostID"].ToString();
42             strPostTitle = xxx;//同上
43             return strPostID;
44         }
45         else
46         {
47             strPostTitle = "";
48             return strPostID;
49         }
50     }


总结一下,这个方法对于结构比较简单(主要是深度比较小的)的网站,个人感觉要比操作XML文件简单,直接写程序就可以实现动态修改了,但是对于结构比较复杂(深度比较大的)网站,还是写XML比较直接.
posted @ 2008-07-09 22:37 FrostX 阅读(218) | 评论 (1)编辑
    最近在用GridView的时候用到FindControl()在TemplateField中发现总是Find不到,在网上搜索了一下,发现很多朋友跟我遇到的问题一样,而且网上很多人的解决方法不是很好,我自己总结了一下:
    对于在RowDataBound中Find,可以用if (e.Row.RowType == DataControlRowType.DataRow)来限制Find的范围,因为Find默认是在HeaderTemplate中找,如果不限定范围,在HeaderTemplate中找不到,自然就返回null,然后就出错了,DataControlRowType枚举中的DataRow确定是数据行.
    另一个是在RowCommand中,我发现遇到这个问题的朋友貌似比上一个要多,在RowCommand中,如果使用GridView默认的模式,e.CommandArgument自动棒定为该行的Index,这时候只要指定gridview1.Rows[Convert.ToInt32(e.CommandArgument)].FindControl("xxx")就可以了,但是如果转化为Template,e.CommandArgument并不会自动绑定任何值,需要手动绑定,可以在<ItemTemplate></ItemTemplate>手动写CommandArgument="<%# ((GridViewRow) Container).RowIndex %>",把这个行的 Index绑定绑定到该e.CommandArgument就可以了.很多初学者在这里不明白为什么要这么做,其实我也是初学者,简单的说一下,就是行是根据数据循环的,每一行都有同样的控件,如果不指定行的Index,简单的写gridview1.findcontrol("xxx"),IDE并不知道要找哪个控件所以要指定行号.
posted @ 2008-07-07 15:47 FrostX 阅读(409) | 评论 (0)编辑