`

小知识(四)

阅读更多

 

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

http://topic.csdn.net/u/20110217/00/7bae254f-447b-4f1c-8c43-c6ff794f40e0.html?seed=422573368&r=71841771#r_71841771

 

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/84494968 9

 

10.使用Linq to SQL的ExecuteQuery()返回的IEnumerable<T>不能进行多次(两次以上)结果集查询(报的错是无法枚举查询结果多次)    且查询时不能释放上下文DataContext    可先将结果缓存到IList对象中

http://www.1000year.com/blog/122.htm

 

11.Linq实现select  from where in()

http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/fda19d75-b2ac-4fb1-801b-4402d4bd5255

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'BUILTIN\Administrators', N'master'"

http://hi.baidu.com/mani/blog/item/08292e97f144096655fb96ae.html

http://blog.csdn.net/cnbird2008/archive/2007/09/27/1802375.aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics