Archive for .NET ( C# )

备忘2

6.使用asp.net的fileupload控件上传文件,需要注意几点:
A)上传目录必须对ASPNET用户有可写权限.
B)默认文件大小被限制为4M,需要修改machine.config增大它.
C)通过验证控件限制文件类型:

  1. ErrorMessage="Only mp3, m3u or mpeg files are allowed!" 
  2. ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))
  3.     +(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U)$" 
  4. ControlToValidate="FileUpload1">


D)通过服务器端验证文件类型:string fileExt =  System.IO.Path.GetExtension(FileUpload1.FileName); if (fileExt == “.mp3″)…

 7.Repeater这个控件没法帮你传递Row中的信息,所以常用.Items[i].FindControl这种方式取得某行的子控件,需要注意的是,这只能得到客户端该控件的用户行为,比如说checkbox控件是否被选中,但没法传递数据,因为这样是不行的,得不到Text的值的,用因此,这里可以使用数据源来传递数据,如下代码段:

  1. for (int i = 0; i < this.slidelist.Items.Count; i++)
  2.                         {
  3.                             if (int.Parse(dt_source.Rows[i]["intID"].ToString()) + ", ") > 0)
  4.                             {
  5.                                 HtmlInputCheckBox cb = this.slidelist.Items[i].FindControl("CheckBox1") as HtmlInputCheckBox;
  6.                                 cb.Checked = true;
  7.                             }
  8.                         }

 8.取得行号的方法在datagrid和repeater中不一样.
datagrid是Container.DataItemIndex,而repeater则是DataBinder.Eval(Container,”ItemIndex”).另外,datagrid在winform中的使用和repeater相同.

Comments

备忘

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

所以,我必须把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 (1)