Archive for May, 2007

备忘

我这个人记性实在太差,费劲心思做出的答案,往往一转眼就忘掉了,偏偏答案忘了也就算了,却还会记得问题,如果问题也忘了我也就清静了,一切从头来过,可是就算所有人都不记得了,我却能把以前曾经发生过什么问题记忆的一清二楚,只是忘却了这个问题当初是怎么解决的…..

所以,我必须把FAQ记下来:

1.向文件里写数据,关闭文件之后,却发现只写入了一部分内容,其余被截断了.这是为什么?

检查是否调用了flush函数,如果没有,则内存里的内容不一定全部能写入文件.

2.做模板时,可能需要替换$A$为一个控件的内容,比如替换为DetailView控件的内容,这样可以利用控件方便的绑定数据产生html脚本,如何做呢?

利用控件的RenderControls函数,贴代码吧:

                System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
                System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
                DetailsView dw = new DetailsView();
                dw.DataSource = ds.Tables[0];
                dw.DataBind();
                dw.RenderControl(oHtmlTextWriter);
                content = content.Replace(”$VDetail$”, oStringWriter.ToString());

3.使用ObjectDataSource控件时,如果动态修改了SelectMethod属性,会出现一种怪现象,比如原先SelectMethod=A,SelectParameters为空,修改后SelectMethod=B,SelectParameters有两个参数.当点击页码查看下一页时,进入到Page_Load时发现,SelectParameters仍然为两个参数,而SelectMethod还原成A了…..

解决方案一:根据MSDN上的示例用法,尽可能不去修改SelectMethod,而仅修改SelectParameters的个数,也就是将B函数写成A函数的不同参数个数的重载函数….这个真是晕…..还有修改参数时不要忘了调用:ObjectDataSource1.SelectParameters.Clear();

解决方案二:没试过,但我想如果自己重载GridView的分页函数,重新绑定一下SelectMethod应该也是可以解决的….

4.当在GridView_RowDataBound的函数中,需要判断DataKeys的值时,应注意DataKeys数组的下标是相对当前页的index,而非整个数据集的index,因此可以这么用:

index = e.Row.DataItemIndex - gvVulnerabilities.PageIndex * gvVulnerabilities.PageSize;
this.gvVulnerabilities.DataKeys[index][”Owner”].ToString();

5.当从列表界面进入某记录的编辑,编辑后想要返回原列表界面的做法:

由于编辑完提交时页面进入PostBack状态,已经丢掉了原先的来源URL,因此假借session帮个小忙,当!Page.IsPostBack时,调用 Session.Add(”url”, Request.UrlReferrer.AbsoluteUri);当Page.IsPostBack时,调用
if (Session[”url”] != null)
    {
     string tmp = Session[”url”].ToString();
     Session.Abandon();

     Response.Redirect(tmp);
    }
PS:要注意的是,当链接来自于地址栏输入或者按钮用window.location的方法都会使UrlReferrer为null,但服务器端使用Response.Redirect是可以的.

Comments