1.使用AspNetPager给数据由数据源控件提供的数据控件实现分页(本例以DataList为例,数据源控件为SqlDataSource)
①将DataList,两个SqlDataSource(为什么要两个后面会说),AspNetPager拖入页面里。
②配置其中一个SqlDataSource2,然后将DataList的数据源指向SqlDataSource2,这时DataList会根据SqlDataSource2的SelectCommand="SELECT * FROM [Student]" (比方说是这样设置的)自动生成相应的<ItemTemplate>。
③然后设置SqlDataSource1如下:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:aspnetpagerConnectionString %>"
SelectCommand="with Temptable as (select row_number() over (order by id) as 行号,* from student ) select * from Temptable where 行号 between @StartIndex and @EndIndex">
<SelectParameters>
<asp:ControlParameter ControlID="AspNetPager1" DefaultValue="1" Name="StartIndex"
PropertyName="StartRecordIndex" Type="Int32" />
<asp:ControlParameter ControlID="AspNetPager1" DefaultValue="10" Name="EndIndex"
PropertyName="EndRecordIndex" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
注意SelectCommand里写的分页语句是关键(sql分页语句),其中@StartIndex和@EndIndex是开始和结束的参数,非常重要的一点是这两个参数的值是由AspNetPager控件的两个属性StartRecordIndex和EndRecordIndex提供的,而这两个属性是在SqlDataSource1的<SelectParameters>(参数属性,其他还有<DeleteParameters><UpdateParameters><InsertParameters>|在这些参数属性内可以选择ControlParameter,CookieParameter,FormParameter,Parameter,ProfileParameter,SessionParameter,QueryStringParameter|如果你对其设置不是很在行,你可以通过图形界面来设置)里指明的,这里指明的有ControlID="AspNetPager1",Name="StartIndex"(很重要,而且要与分页语句里的参数名相同)PropertyName="StartRecordIndex"(参数值由AspNetPager1的StartRecordIndex属性值提供)
④然后还必须设置AspNetPager1的RecordCount属性(绑定的表里一共有多少条记录),这里用LINQ统计的,如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataClasses1DataContext db = new DataClasses1DataContext();
var result = db.Student.Count();
AspNetPager1.RecordCount = result;
}
}
⑤这样设置完之后再将DataList1的DataSourceID="SqlDataSource1"就可以删除SqlDataSource2了,之所以要用SqlDataSource2是因为,如果先设置DataSourceID="SqlDataSource1"的话,由于SqlDataSource1的SelectCommand没有明确要显示哪些字段,所以将不会自动生成相应的<ItemTemplate>。
补:也可以使用存储过程来实现,只要将SelectCommand="存储过程名"再加一个属性SelectCommandType="StoredProcedure"就可以了,不过存储过程里的参数名也必须等于此处是StartIndex和EndIndex。至于不用数据源控件而在程序中给数据控件配置数据源,这里就不说了,需要设置AspNetPager的AspNetPager1_PageChanged事件是不同之处。至于AspNetPager的样式及跳转到哪一页等其他效果,可以下载AspNetPager的官方示例,都有很详细的说明。
2.如果像上面那样用会有个疑问:用数据源控件给数据控件提供数据源,怎么控制其绑定的执行?默认是产生页面或回发时都会执行绑定,如何才能..比如说只有我的一个按钮的单击事件才能使绑定执行。(只要适时的设置数据控件的DataSourceID即可):
Protected void Page_Load(object sender,EventArgs e)
{
Repeater1.DataSourceID=""; 在产生页面或回发时将其DataSourceID设为空
}
Protected void Button1_Click(object sender,EventArgs e)
{
Repeater1.DataSourceID="SqlDataSource3"; 单击时再设置其DataSourceID
}
3.在VS中如果遇到光标占位的情况,可以试着按一下Insert键
4.设置网站在浏览器上的个性小图标:http://hi.baidu.com/yimeng3025/blog/item/245d602b93609624d42af18e.html
http://www.cnblogs.com/yangbin1005/archive/2008/08/15/1268714.html
http://www.cnblogs.com/whitetiger/archive/2008/02/18/1072290.html
5.数据控件绑定数据时应该考虑的顺序
1.手工绑定 Page_Load(){ 绑定 } 回发后希望重新绑定数据
2.手工绑定 Page_Load(){ if(!IsPostBack){绑定} } 回发后不希望重新绑定数据,希望得到回发前的数据
3.使用数据源控件 几乎能满足各种情况
如果绑定数据的控件是单独使用那么2与3是等同的,因为ASP.NET会为其保存状态,即便你回发后没再重新绑定数据。
但如果绑定数据的控件位于Repeater或GridView等控件里,那么2回发后不但不会得到回发前的数据,而且由于其实重新动态生成,其连数据都不会有(如果在相应的事件里再为其绑定数据就另当别论了)。但3回发后则能得到回发前的数据,然后再重新动态生成的同时重新绑定数据。
所以2与3不总是等同的。
http://www.cnblogs.com/hanmeimei/archive/2011/02/18/RadomOnlineExam.html
6.GridView通过使用数据源控件来享受自带的编辑编辑排序分页时需要回发,不能在UpdatePanel里面(貌似可以在UpdatePanel里面,反正出了问题的话,这方面改改试试) 但编辑删除失效的话必须考虑是否设置了DataKeyNames,而不是像http://www.ljf.cn/2007/7/Item17687.html说的那样。
7.在Repeater的HeaderTemplate和FooterTemplate中找控件
http://hi.baidu.com/4402957/blog/item/992746fbc29e5a1e6d22ebdc.html
http://www.cnblogs.com/JeffYang/archive/2007/07/23/828724.html
8.updatepanel回调时会回调所有的数据,这些数据到达服务器端后会经历一个完整的ASP.NET页面生命周期,与回发不同之处就是只无刷新的更新updatepanel内部的控件。
所以使用updatepanel只是表面上实现了Ajax回调效果,但效率上不能替代Ajax回调。
http://developer.51cto.com/art/200907/140180.htm
http://hi.baidu.com/ustc10/blog/item/3795b61037c7c6fbc3ce799f.html
9.Global.asax文件
http://shirlly.iteye.com/blog/518955
http://www.cnblogs.com/caoxch/archive/2006/11/22/568342.html
相关知识:
http://kendezhu.iteye.com/blog/844949的6和8 9
10.使用Linq to SQL的ExecuteQuery()返回的IEnumerable<T>不能进行多次(两次以上)结果集查询(报的错是无法枚举查询结果多次) 且查询时不能释放上下文DataContext 可先将结果缓存到IList对象中
http://www.1000year.com/blog/122.htm
11.Linq实现select from where in()
http://www.cnblogs.com/chriskwok/archive/2010/04/03/LINQ.html
也可以用ExecuteQuery()的方式实现,但注意in()里的东东,貌似不能使用参数的方式,老是查不出,只能使用拼接字符串的方式,就如同select top一样,不知SQL Server2008解决这一问题了没有,列位谁知道劳您通知一声。
12.集合多次添加同一引用类型的实例(如数组,集合等)的机制
集合多次添加该引用类型时会不断的添加它的地址(该集合内的元素个数也会增加,但都指向该引用类型的同一对象,所以只要该对象一变,遍历集合时所有的元素都会变(因为这些元素指向的对象变了))
13.注意like语句那单引号的位置,要放在通配符的外面
http://www.cnblogs.com/ugoer/archive/2006/09/15/505596.html
14.List<T>的GetRange(int index,int count)方法
http://msdn.microsoft.com/zh-cn/library/21k0e39c(v=vs.85).aspx
protected void Button1_Click(object sender, EventArgs e)
{
string[] str = new string[] { "1", "2", "3", "4", "5", "6", "7", "8" };
List<string> list = new List<string>(str); 将实现了IEnumerable<T>的集合或数组中的元素复制到list里
很多泛型集合类型的构造函数都有这个功能
string[] a = list.GetRange(2, 4).ToArray(); 从第2位开始截取4个元素
foreach (var item in a)
{
TextBox1.Text += item;
}
}
15.List<T>的Sort()方法
http://msdn.microsoft.com/zh-cn/library/w56d4y5z.aspx
http://www.cnblogs.com/azure/archive/2009/08/01/ASP_NET_LIST_SORT_FIND_DELEGATE.html|的9楼
protected void Button1_Click(object sender, EventArgs e)
{
List<pp> list = new List<pp>();
pp p1=new pp();
p1.A=0.1;
p1.B=3;
pp p2=new pp();
p2.A=0.3;
p1.B=1;
pp p3=new pp();
p3.A=0.2;
p3.B=2;
TextBox1.Text="0.10.30.2";
list.Add(p1);
list.Add(p2);
list.Add(p3);
//list.Sort((u, v) => u.A < v.A); 无法将 lambda 表达式 转换为类型“System.Collections.Generic.IComparer<Test_Test7.pp>”,原因是它不是委托类型
//list.Sort(); 必须至少有一个对象实现 IComparable(元素是简单数值类型或字符串的话除外)
list.Sort((v1, v2) => { return Comparer<double>.Default.Compare(v1.A, v2.A);}); //按pp类的A字段从小到大排序
foreach (var item in list)
{
TextBox2.Text += item.A.ToString();
}
}
16.VS设断点调试的时候最好把updatepanel去掉,有updatepanel也不利于异常的调试。通常建议updatepanel只有在完成网站时才运用,有时在平常运行网站(不是调试)时,如果代码有错误,由于updatepanel的存在,将不会看到异常,尤其是用chrome这种只有"审查元素"才会看到javascript错误的浏览器的时候。
17.Chrome浏览器可以通过F11来切换全屏与非全屏。最近发现IE8也可以,想许多其他浏览器也可以吧。
18.由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
http://blog.csdn.net/liulun/archive/2008/01/24/2064048.aspx
19.无法打开用户默认数据库 登录失败
如果不小心修改了默认登录数据库,而不幸的是该数据库被分离了,可以使用以下命令为某帐号修改默认数据库为master,下面两条链接是参考,都有错误,我结合了一下
osql /E /d"master" /Q"exec sp_defaultdb N'BUILTINAdministrators', N'master'"
http://hi.baidu.com/mani/blog/item/08292e97f144096655fb96ae.html
http://blog.csdn.net/cnbird2008/archive/2007/09/27/1802375.aspx