2008.11.15 / 标签:
asp.net ajax控件 / 分类:
ASP.NET
这次开发的CRM中有许多地方都使用到了ASP.NET中的GridView控件,这个控件的功能其实都是很全的,但是此次开发中不允许使用控件自带的分页,而是要求开发人员自己写。由于自己写的分页代码比较多,且项目中使用的GridView控件也是很多,为了偷懒+减少代码量…于是昨天晚上花了点时间做了这么个自定义WEB用户控件,写的时候也遇到了些问题,不过随着逐步的分析都逐一解决了,以下是该控件的源码。
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections.Generic;/** * 功能:对GridView数据分页 * 作者:Neeke * 版权所有:尼克技术博客 http://www.ineeke.com * */public partial class WebUserControl : System.Web.UI.UserControl{ PagedDataSource pds = new PagedDataSource(); //待分页的数据源 public IEnumerable DataSource; //每页显示数据条数 public int pageSize = 10; //待分页显示的GridView对象 public GridView PageGridView; //当前页 public int CurrentPage { get { return (Int32)ViewState["CurrentPage"]; } set { ViewState["CurrentPage"] = value; } } //分页个数 public int Count { get { return (Int32)ViewState["Count"]; } set { ViewState["Count"] = value; } } //数据绑定 public void PageDataBind() { if (!IsPostBack) { CurrentPage = 0; Count = 0; } //用于判断是否越界 if (CurrentPage > Count || CurrentPage < 0) { return; } try { pds.DataSource = DataSource; pds.AllowPaging = true; pds.PageSize = pageSize; pds.CurrentPageIndex = CurrentPage; Count = pds.PageCount; this.lblTotalCount.Text = pds.DataSourceCount.ToString(); this.lblPageSize.Text = pageSiz
e.ToString(); this.lblCurrentPage.Text = Convert.ToString(CurrentPage + 1); this.lblTotalPage.Text = Convert.ToString(Count); PageGridView.DataSource = pds; PageGridView.DataBind(); } catch (Exception ex) { Response.Write("<script>alert('没有您输入的页!');</script>"); } } //第一页按钮按下时触发 protected void LinkFirst_Click(object sender, EventArgs e) { CurrentPage = 0; PageDataBind(); } //前一页按钮按下时触发 protected void LinkPrie_Click(object sender, EventArgs e) { if (CurrentPage <= 0) { CurrentPage = 0; } else { CurrentPage = CurrentPage-1; } PageDataBind(); } //下一页按钮按下时触发 protected void LinkNext_Click(object sender, EventArgs e) { if (CurrentPage >= (Count - 1)) { CurrentPage = Count - 1; } else { CurrentPage=CurrentPage+1; } PageDataBind(); } //最后一页按钮按下时触发 protected void LinkLast_Click(object sender, EventArgs e) { CurrentPage = Count - 1; PageDataBind(); } //GO按钮按下时触发 protected void btnGo_Click(object sender, EventArgs e) { CurrentPage = int.Parse(this.txtGoPage.Text)-1; PageDataBind(); }}
使用方法: 1.将此控件拖入到网页中。 2.在该网页的Page_Load()事件中写入如下代码。
protected void Page_Load( object sender, EventArgs e)
{
this .WebUserControl1.DataSource = SaleChanceManager.GetChanceAll();
this .WebUserControl1.pageSize = 5;
this .WebUserControl1.PageGridView = this .GridView1;
this .WebUserControl1.PageDataBind();
}
protected void Page_Load(object sender, EventArgs e) { this.WebUserControl1.DataSource = SaleChanceManager.GetChanceAll();//设置待数据源 this.WebUserControl1.pageSize = 5;//设置每页数据条数 this.WebUserControl1.PageGridView = this.GridView1;//设置待分页的GridView this.WebUserControl1.PageDataBind();//调用绑定方法 }
2008.11.10 / 标签:
asp.net 优化 ,
代码书写规范 / 分类:
ASP.NET
今天早上,团队4人在我昨天做的类图及Models层的基础之上对DAL层完成了所有编码。之后又小测试了一下,发现数据库中数据类型为bigint的无法使用int来强制转换进行读取,之后使用long类型顺利读出。
好像文章有点短,接[ASP.NET必须遵守的9条代码编写规范 ] 再发5条ASP.NET指导性规范,这些规范感觉都很有用,写的时候可能觉得麻烦,但是后期查看时会觉得代码很清晰。
(1)对于超过三屏以上的代码,建议使用region折叠。 (2)Web窗体建议以DIV方式布局。 (3)代码中DataSet、DataTable、DataView等对象,定义时建议将ds、dt、dv作为前缀。 (4)在一个自定义的类中,建议将类中各成员,有规律的组织起来。从上至下的顺序为常量、变量、属性、公有方法、私有方法。可以将每个部分用region划分开。 (5)if、for、foreach及switch语句的嵌套不宜太多,建议不超过三层
2008.11.04 / 标签:
代码书写规范 / 分类:
ASP.NET
写了这么久程序代码了,发现很多人的代码很不规范。尤其在几个人协作开发一个项目的时候,有些人写的类名、变量名、方法等令人根本看不懂,可能会弄的整个项目都没法组合完成。自认为我的写的代码已经很不错了,至少能够见名知意。不过,看完这9条后我觉得我还得进一步学习学习了… 1.局部变量的名称要有意义,尽量用对应的英文命名,比如“用户姓名”变量,不要用aa bb cc等来命名,而要使用userName。 2.不要使用单个字母的变量,如i、n、x等。而要使用index、temp等。用于循环迭代的变量例外。 3.应该使用Pascal命名法命名方法名、属性名、类名和命名空间,且方法的命名一般将其命名为动宾短语,如: ShowDialog(); CreateFile(); GetPath(); 4.用Camel命名法命名局部变量和方法的参数。 以上几条综合举例如下。
public class Neeke
{
public Neeke()
{
}
private string neekeName;
public string NeekeName
{
get { return neekeName; }
set { neekeName = value; }
}
public void CallMe()
{
System.Console.WriteLine( "Hello Neeke!" );
}
}
public class Neeke{ public Neeke() { } private string neekeName; public string NeekeName { get { return neekeName; } set { neekeName = value; } } public void CallMe() { System.Console.WriteLine("Hello Neeke!"); }}
5.仅使用匈牙利命名法对WinForm和Web空间命名,禁止使用textbox1、gridview1等默认命名。 6.接口命名以大小写I作为前缀,如INeeke,以便直观的区分接口和类。 7.使用命名空间的层次性结构来组织各种类和接口。 正确: using www.ineeke.com ; namespace ineeke.com { … } 错误: using WwwIneekeCn; namespace IneekeCn { … } 8.所有代码必须保证有足够的注释,注释量要求在15%以上。需要注释的内容包括以下几种。 1)关键性语句(如关键的变量声明,条件判断等)。 2)类名前的文档注释(以//开头的注释)包括类的简单功能说明、使用方法等。 3)具有复杂参数列表的方法。 9.代码缩进用Tab键,不要使用空格键。
2008.10.30 / 标签: / 分类:
ASP.NET
应用程序缓存是用来存储与应用程序相关的对象,主要由Cache类来实现。他给我们提供了一种机制,使得我们可以通过编码方式灵活的控制缓存。 1.添加缓存的几种方法 using System.Web.Caching; (1)指定键和值。实现代码如下: Cache["Neeke"] = NeekeInfo; 这种方法添加缓存最方便,但是如果需要设置缓存的有效期、依赖项等特性,它就变得无能为力了。这时可以使用下面的方法。 (2)使用Add()方法 这种方法适用于需要设置缓存的有效期、依赖项等特性的换粗。其实现代码如下。 Cache.Add("Neeke","NeekeInfo",null,DateTime.Now.AddSecond(6),TimeSpan.Zero,CacheItemPriority.High,null); 我们使用Add()方法时,要注意它的7个参数必须写完整才能生效,所以灵活性不够好。 (3)使用Insert()方法。 使用Insert方法可以实现多种方式的方法重载,使用起来比较灵活。 只需要键和值两个参数就可以添加缓存。 Cache.Insert("Neeke","NeekeInfo"); 添加依赖项的缓存如下: Cache.Insert("Neeke","NeekeInfo",new System.Web.Caching.CacheDependency(null,dependencies)); 设置有效期策略的缓存如下: Cache.Insert("Neeke","NeekeInfo",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoSlidingExpiration); 添加优先级的缓存如下: Cache.Insert("Neeke","NeekeInfo",null,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoAbsoluteEpiration,System.Web.Caching.CacheItemPriority.High,null); 2.检索缓存 由于缓存易失,所以在从缓存中检索应用程序数据缓存对象时,要先判断缓存项是否存在,然后再检索。 3.移除应用程序数据缓存对象 (1)自动移除 出现缓存已满、过期、依赖项更改等情况时,缓存项就会自动移除。 (2)显示移除 Cache.Remove("Neeke");
2008.10.28 / 标签: / 分类:
ASP.NET
HttpContext代表的是当前访问的上下文,你可以通过它获取当前会话的相关信息,它其实来自于一个委托的参数原形、该委托的声明如下。 public delegate string HttpResponseSubstitutionCallback(HttpContext context) 使用委托可以在运行时动态设定要调用的方法,比如一个事件它本身不能完成一定的功能,就可以通过委托其他方法来实现。调用委托时要注意,调用的方法必须与委托的方法有相同的方法签名。如Subsitution控件的MethodName调用的方法必须与HttpResponseSubstitutionCallback委托的签名相匹配,返回结果为string格式,参数为HttpContext类型。
一个股票报价的网站一般都是几分钟,快的几秒钟更新一次报价数据。像这种在一定时间内,内容不需要更新的数据,我们可以使用整页缓存技术来进行处理。 整页缓存是最简单的缓存形式,也是最常用的缓存形式。它将整个页面进行缓存,主要适用于以下两种情况。 1.不需要频繁更新数据的页面。 2.占用大量时间和资源才能编译生成的页面。 整页缓存有如下几个必须且常用的属性。 1.Duration 必需属性。表示页面被缓存时间,以秒为单位。 2.VaryByParam 该属性是以分号分隔的字符串变量,以其中每一个变量作为参数传递的页都将被作为缓存处理。“none”表示不随任何参数变化,“*”表示根据所有参数变化。 3.VaryByControl 该属性是以分号分隔的字符串变量,用来改变用户控制的输出缓存。这些字符串代表用户控件中声明的服务器控件ID。 4.Location 指定输出缓存项的位置。默认为Any。 5.VaryByCustom用于自定义输出缓存要求,它允许在global.asax中指定自定义变动。如果该属性值是browser,则缓存将随浏览器名称和主要版本信息的不同而异。
2008.10.22 / 标签: / 分类:
ASP.NET
晕,两天就把ASP.NET的AJAX控件讲完了,其实还有很多没讲,是需要自己后期需要用的时候再自学的。从现在开始学习ASP.NET的缓存技术了,现来了解了解什么是缓存技术。缓存技术是一项应用十分广泛地技术,也是ASP.NET中不可缺少的特性,使用缓存技术,可以大大提高程序的性能。 通常大部分Web应用程序需要不断的和数据库交互,如果在数据量非常大的情况下,将会严重降低应用程序的性能。举例来说:某大型电厂的阅读指标汇总报表页面,他需要复杂的逻辑来处理大量数据,然后再将数据作为报表返回,而这些报表是用户频繁访问的,如果访问量很大,那么我们的Web应用程序的性能就非常低下,甚至会崩溃。为了解决这个问题,缓存技术就应运而生了。 缓存技术的基本原理是把访问频繁的数据以及需要大量处理时间来创建的数据存储在内存中,当用户请求这些数据时,系统直接将内存中的数据返回给用户,从而大大提高应用程序的性能。例如我们刚才所说的月度指标汇总报表数据一般一个月都不会改变,这时我们可以把他缓存起来。当用户第一次请求时,程序执行复杂的创建报表计算,但是当用户再次请求时则直接返回报表结果,从而避免复杂的重新创建报表的过程,这样大大提高了网站的性能。 毋庸置疑,使用缓存技术大大提高了数据访问的效率,但是他的缺点也是非常明显的,那就是数据过期问题。在现实生活中,很多Web应用程序对数据的实时性要求非常高,如银行实时交易、股票报价等信息。一旦出现数据过期问题,后果不堪设想。为了应对不同情况下对缓存实时性的要求,ASP.NET推出了以下几种缓存技术: 1.整页缓存。 2.页面部分缓存。 3.应用程序缓存。
5步就能学会使用这个ConfirmButtonExtender控件,半个代码都不需要你手动去写,微软出品的东西总是简单易用,貌似完全把使用者当白痴对待,汗~ 1.在ASP.NET AJAX-Enabled Web Site中新建一个ConfirmButton.aspx文件。 2.拖入一个ScriptManager和一个UpdatePanel。 3.向UpdatePanel中拖入一个Button控件和一个ConfirmButtonExtender控件。 4.修改ConfirmButtonExtender控件的TargetControlID属性为Button的ID。 5.修改Button的ConfirmText属性,输入一段信息:尼克技术博客http://www.ineeke.com欢迎您光临!这段信息将在弹出的窗口中显示。 现在这个AJAX效果已经做好了,运行这个程序,单击一下Button就能看到效果了。不过这个效果用不着这么麻烦吧,微软是不是脑子秀逗了,完全可以直接用JavaScript弹的嘛!
AlwaysVisibleControlExtender控件直译出来就是“始终显示”。个人感觉这个控件貌似有点多余,不知道究竟有多大用处。既便如此,我们还是得了解了解它。 我们把浏览器的窗口若分成3行3列的话,AlwaysVisibleControlExtender控件便可以让我们要显示的信息在这分出来的9个方框的任何一个中出现。下面来看看具体如何使用它。 首先创建一个ASP.NET AJAX-Enabled Web Site,打开默认创建好的Default.aspx文件并进入设计模式。 你将会看到一个ScriptManager控件在上面,千万可别把它删除哦,删了就不能使用AJAX了。 向页面中拖入一个UpdatePanel控件,再分别向UpdatePanel中拖入一个panel和一个AlwaysVisibleControlExtender控件。在pnael中我们可以写一些信息,例如: 尼克技术博客 学习笔记 ,接下来选中AlwaysVisibleControlExtender控件并修改其属性TargetControlID为写有信息的那个panel。 接下来再向UpdatePanel中拖入一个DropDownList同时启用DropDownList的AutoPostBack属性,并为其增加如下几项值:
<asp:DropDownList ID= "DropDownList1" runat= "server" AutoPostBack= "True" OnSelectedIndexChanged= "DropDownList1_SelectedIndexChanged" >
<asp:ListItem Value= "11" >默认</asp:ListItem>
<asp:ListItem Value= "00" >左上</asp:ListItem>
<asp:ListItem Value= "01" >中上</asp:ListItem>
<asp:ListItem Value= "02" >右上</asp:ListItem>
<asp:ListItem Value= "10" >左中</asp:ListItem>
<asp:ListItem Value= "11" >中中</asp:ListItem>
<asp:ListItem Value= "12" >右中</asp:ListItem>
<asp:ListItem Value= "20" >左下</asp:ListItem>
<asp:ListItem Value= "21" >中下</asp:ListItem>
<asp:ListItem Value= "22" >右下</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> <asp:ListItem Value="11">默认</asp:ListItem> <asp:ListItem Value="00">左上</asp:ListItem> <asp:ListItem Value="01">中上</asp:ListItem> <asp:ListItem Value="02">右上</asp:ListItem> <asp:ListItem Value="10">左中</asp:ListItem> <asp:ListItem Value="11">中中</asp:ListItem> <asp:ListItem Value="12">右中</asp:ListItem> <asp:ListItem Value="20">左下</asp:ListItem> <asp:ListItem Value="21">中下</asp:ListItem> <asp:ListItem Value="22">右下</asp:ListItem></asp:DropDownList>
双击DropDownList的SelectedIndexChanged事件,并写入如下代码:
switch ( this .DropDownList1.SelectedValue[0])
{
case ’0′ :
avce.VerticalSide = VerticalSide.Top;
break ;
case ’1′ :
avce.VerticalSide = VerticalSide.Middle;
break ;
case ’2′ :
avce.VerticalSide = VerticalSide.Bottom;
break ;
default :
&n
bsp; avce.VerticalSide = VerticalSide.Middle;
return ;
}
switch ( this .DropDownList1.SelectedValue[1])
{
case ’0′ :
avce.HorizontalSide = HorizontalSide.Left;
break ;
case ’1′ :
avce.HorizontalSide = HorizontalSide.Center;
break ;
case ’2′ :
avce.HorizontalSide = HorizontalSide.Right;
break ;
default :
avce.HorizontalSide = HorizontalSide.Center;
return ;
}
switch (this.DropDownList1.SelectedValue[0]) { case '0': avce.VerticalSide = VerticalSide.Top; break; case '1': avce.VerticalSide = VerticalSide.Middle; break; case '2': avce.VerticalSide = VerticalSide.Bottom; break; default: avce.VerticalSide = VerticalSide.Middle; return; } switch (this.DropDownList1.SelectedValue[1]) { case '0': avce.HorizontalSide = HorizontalSide.Left; break; case '1': avce.HorizontalSide = HorizontalSide.Center; break; case '2': avce.HorizontalSide = HorizontalSide.Right; break; default: avce.HorizontalSide = HorizontalSide.Center; return; }
现在你可以保存并运行这个AJAX了,在下拉框中选中你要它显示的位置,它就会根据你的指令走了。
如果你觉得你的信息框不好看,那么你可以在panel的属性中对其样式进行修改。 至于DropDownList1.SelectedValue[0]其意就是取出当前选中的值的索引为0的字符,例如Value="11"那么这里取出的便是“1”,之后对其进行判断,进而改变panel在网页中的位置。
2008.10.18 / 标签:
ajax / 分类:
ASP.NET
开始学习ASP.NET的AJAX控件了,不过默认安装的VS2005上是没有这个控件库的,需要我们自己手动安装。
1,下载并安装 ASPAJAXExtSetup.msi
http://download.microsoft.com/download/5/4/6/5462bcbd-e738-45fa-84ca-fa02b0c4e1c2/ASPAJAXExtSetup.msi 下载完 ASPAJAXExtSetup.msi 安装更新后在你的系统盘下的(以C盘为例)出现这个文件夹: C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 ajax Extensions\v1.0.61025
安装这个后我们就可以创建Asp.net AJAXEnabledWebSite站点了,这其实就是个ajax.net网站的模板。但是我们现在还不能使用微软给我们开发好的ajax控件。
2,下载AjaxControlToolkit
http://www.codeplex.com/AjaxControlToolkit/Release/ProjectReleases.aspx?ReleaseId=11121 有带源代码的和不带源代码的toolkit。下载完成后把该文件解压到:
C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 ajax Extensions\v1.0.61025\AjaxContronlToolkit\
双击运行AjaxControlToolkit.sln。
用vs2005 打开这个sln,编译TemplateVSI这个项目后,把在C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 AJAX Extensions\SampleWebSite\Bin下面生成的AjaxControlToolkit.dll和 AjaxControlToolkit.pdb复制到
C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 AJAX Extensions\Binaries文件夹下面,这样我们就可以在vs2005中使用ajax.net这些控件了。
新建一个Ajax ControlToolkitWebSite 类型的web项目。在工具栏中新添加一个选项卡起名:AjaxControltoolkit
在这个选项卡上右键选择项->浏览找到刚才复制过去的AjaxControlToolkit.dll,添加进来。这样我们就ajax.net控件成功引用到vs2005中了 。