车老师文章:DotNet开发技巧

时间:2021-10-12 20:26:42

在华育学.NET时候的老师车延禄的文章,今天重新看了一次原版帖在blog上:

(一)
1、通过Response.Redirect进行页面跳转时,对链接传递的参数进行加密:
Response.Redirect("VC21Target.aspx?name="+System.Web.HttpUtility.UrlEncode(txtName.Text) +"&password="+System.Web.HttpUtility.UrlEncode(txtPassword.Text));
2、CheckBoxList控件的几个常用的属性:
selected:设置和取得复选项的选定状态。
Text:复选项所显示的文本。
Value:复选框的关联值,用来存储复选框的标识或说明等。
RepeatLayout: =Table--复选框以表格型式呈显;=Flow--复选框不以表格型式呈显
RepeatDirection: =Vertical--复选项先上下后左右排列;=Horizontal--复选项先左右再上下排列;

若要判断哪个复选项被选定,使用循环来检测Items集合中的每一个成员的Selected属性

CheckBoxList中可以直接绑定至数据源:
DataTextField、DataValueField这两个属性指定列表框绑定数据表中的哪个字段。
1、绑定至数组:
MyCheckBoxList.DataSource=MyArray;
MyCheckBoxList.DataBind();
2、绑定至数据表:
MyCheckBoxList.DataSource=DV; //DV 是数据视图或数据表;
MyCheckBoxList.DataTextField="info_basic_unit";
MyCheckBoxList.DataTextField="info_basic_cad";
MyCheckBoxList.DataBind();

3、RadioButtonList控件的常用属性与CheckBoxList相似,但要判断哪个单选按钮被选定时,使用SelectedIndex属性或SelectItem.Text。
DataTextField、DataValueField这两个属性指定绑定数据表中的哪个字段。
4、ButtonWeb服务器控件,可以用多个控件共享一段代码,可以在Button的用CommandName属性来区别不同按钮,只要在共享的代码中用
switch(((Button)sender).CommandName)
{
case "btn1" //Button1 的CommandName属性;
……
break;
case "btn2" //Button2 的CommandName属性;
……
break;
……
}

5、Button控件可以在html代码中加入onmouseover 和 onmouseout ,通过在onmouseover和onmouseout中设置this.style.……来替按钮加上鼠标移动效果;
6、ImageButton Web服务器控件
AlternateText:设置当图片无法显示时的取代文本;
ImageUrl:设置图片;
在ImageButton服务器控件的Click事件处理程序的第二个参数ImageClickEventArgs有X、Y属性保存鼠标单击时的X、Y坐标,通过这两个参数可以实现影像地图,判断鼠标点击了哪个区域,以执行不同的命令;

7、DropDownList控件的属性与RadioButtonList相似。
要想使某个选项成为起始选项,可以将该项的selected属性设置成True;
SelectedIndex属性会持有被选取之选项的索引值(从0开始的)。
Selected属性:来设置和取得被列表项的状态。
Text属性:设置列表项的文本;
Value属性:列表项的关联值,用来存储复选框的标识或说明等。

DataTextField、DataValueField这两个属性指定列表框绑定数据表中的哪个字段。

8、HyperLink Web控件用来建立文本超链接或图片超链接:
NavigateUrl:链接所含的URL
Text:指定文本超链接上显示的文本;
ImageUrl:指定图片超链接所显示的图片;
如:
PhotoHyperLink.Text=(string)dr["info_basic_name"];//链接文本;
PhotoHyperLink.NavigateUrl="VC40Photo.aspx?uid="+"imageEmployee-"+dr["身份证号码"]+".jpg";//链接URL;
PhotoHyperLink.Target="_blank";//打开目标图口;

(二)
1、给服务器控件增加客户端onclick事件:
this.printbtn.Attributes.Add("onClick","javascript:window.print();return false;");

2、在datagrid中的链接字段中的“URL格式字符串”的文本框中输入下列文本可以在新窗口中打开浏览器:
javascript:windowpop('view.aspx?planID={0}')

3、将回车转换为TAB
//当在有keydown事件的控件上敲回车时,变为tab
public void Tab(System.Web .UI.WebControls .WebControl webcontrol)
{
webcontrol.Attributes .Add ("onkeydown", "if(event.keyCode==13) event.keyCode=9");
}

4、datagrid分页中如果删除时出现超出索引
public void jumppage(System.Web.UI.WebControls.DataGrid dg)
{
int int_PageLess; //定义页面跳转的页数
//如果当前页是最后一页
if(dg.CurrentPageIndex == dg.PageCount-1)
{
//如果就只有一页
if(dg.CurrentPageIndex == 0)
{
//删除后页面停在当前页
dg.CurrentPageIndex = dg.PageCount-1;
}
else
{
//如果最后一页只有一条记录
if((dg.Items.Count % dg.PageSize == 1) || dg.PageSize == 1)
{
//把最后一页最后一条记录删除后,页面应跳转到前一页
int_PageLess = 2;
}
else //如果最后一页的记录数大于1,那么在最后一页删除记录后仍然停在当前页
{
int_PageLess = 1;
}
dg.CurrentPageIndex = dg.PageCount - int_PageLess;
}

5、如何通过ADO.NET读取数据库中的图片并显示它呢?
6、在web.config中建立数据库连接
在asp.net应用程序下找到web.config文件,在前面加入下面的代码:
链接字符串:
Tempstr="data source="+System.Configuration.ConfigurationSettings.AppSettings["dbserver"]+";initial catalog="+System.Configuration.ConfigurationSettings.AppSettings["dbname"]+";user id="+System.Configuration.ConfigurationSettings.AppSettings["dbid"]+";password="+System.Configuration.ConfigurationSettings.AppSettings["dbpwd"];

7、用html控件在框架页中指定的框架中打开指定网页;
第一步:插入客户端脚本;
function MM_goToURL() { //v3.0
var i, args=MM_goToURL.arguments; document.MM_returnValue = false;
for (i=0; i<(args.length-1); i+=2)
eval(args[i]+".location='"+args[i+1]+"'");
}
第二步:在html按钮中插入以下的html脚本;
onClick="MM_goToURL('parent.frames['topmain']','aaa');return document.MM_returnValue"
用服务器控件在指定的框架中打开指定的网页;

8、在新窗口中打开指定的网页(修改相应的内容可以改成弹出窗口)
Response.Write(" //><!-- "); //--><!

9、要使一个窗口打开后就最大化,可以在html中插入下面的脚本

10、用Cookies进行检查是否正常登录。
在登录首页
Response.Cookies["nickname"].Value="logined";
在其它页面的page_load事件(或框架的一个页面)中加入
bool AllowPass;
AllowPass=false;//标识是否找到cookie中的登录标识;
string[] a=Request.Cookies.AllKeys ;//取出cookie中的所有的内容,以便查找登录标识;
int i;
for(i=0;i<=a.Length -1;i++)
{
if((a[i].ToString ()=="nickname") &&(Request.Cookies[a[i].ToString ()].Value.ToString ()=="logined"))
AllowPass=true;
}
if(AllowPass==false)//使整个框架面面调回登录页面。
{
Response.Write(" ");
}

11、Find方法进行查找:
要用find方法进行查找时必顺要数据表存在主键。
1、 给数据表建立主键:
DataColumn[] Keys=new DataColumn[1];//指定主键列只有一列,如果有多列可以增加数据的个数;
Keys[0]=this.DS_List.Tables["view_list"].Columns["view_cad"];//指定主键是哪一列;
this.DS_List.Tables["view_list"].PrimaryKey=Keys;//建立主键;
2、 应用find方法:
DR=this.DS_List.Tables["view_list"].Rows.Find(TempId[i]);//find参数可以是单个对像,也可以是对像数组;

12、在服务器控件中加入客户端的单击事件onclick方法:
this.closebtn.Attributes.Add("onClick","javascript:self.location.href='../main.aspx';return false;");

13、得到一年中的第一天是星期几:
weekStr=DateTime.Parse(YearValue.ToString() + "-1-1").DayOfWeek.ToString();

14、返回一个月中的天数:
DaysOfMonth = DateTime.DaysInMonth(YearValue,MonthValue);//返回一个月中的天数;

15、在pagebase类中得到应用程序的URL;
URLSuffix=Context.Request.Url.Host+Context.Request.ApplicationPath;
if(URLSuffix.LastIndexOf("/")==URLSuffix.Length-1)
URLSuffix=URLSuffix.Substring(0,URLSuffix.Length-1);
pageHostURL=@"http://"+URLSuffix;

(三)
1、、Cookie的使用:
写入Cookie的方法:
HttpCookie ClientCookie;
ClientCookie=new HttpCookie("UserInfo");    //生成一个名为UserInfo的Cookie;
ClientCookie.Values.Add("UserCad",id);    //将信息写入cookie的索引键中;
ClientCookie.Valuse.Add("UserName",name);    //将信息写入cookie的索引键中;
Response.AppendCookie(ClientCookie);      //将值保存到cookie中
ClientCookie.Expires=System.DateTime.MaxValue; //cookie永久有效;
读取Cookie的方法:
HttpCookie ClientCookie=new HttpCookie("UserInfo");
ClientCookie =Context.Request.Cookies["UserInfo"]; //根据名称取得cookie;
if(ClientCookie==null) return;
string UserCad=ClientCookie.Values["UserCad"].ToString(); //根据索引值取得cookie的键值;

2、将数据库中的图片用文件流保存成图片:
byte[] Pic=new Byte[102400];
Pic=(byte[])DR["view_photo"];
FileStream F = new FileStream(Server.MapPath("../report/pic/")+DR["view_cad"].ToString ()+".jpg", FileMode.OpenOrCreate);
F.Write(Pic,0,Pic.Length );
F.Close();

3、Find方法的用法:
a、在common类库中定义一个DataSet中的DataTable,在该DataTable中定义一主键;

……(向表中加入字段)……
DataColumn[] Keys_Look=new DataColumn[1];
Keys_Look[0]=TB_Look.Columns[FIELD_KEY];
TB_Look.PrimaryKey=Keys_Look;

注:可以将DataColumn[]设成多列,根据多列值查询结果;
b、运用Find方法:
DataRow dr;
dr=data.Tables[CustomSQLStrData.TABLE_LOOK].Rows.Find(e.Item.ItemIndex);

4、iisreset 重新启动IIS;
5、aspnet_regiis -i 注册iis;
6、在框架内的页面中将总页面跳转开始页面的方法:
Response.Write(" ");
7、将生成的html字符串写成excel表格:
string Str_Filename=this.Session["NowUser"].ToString();//取得当前用户名为文件名;
FileInfo FN=new FileInfo(Server.MapPath("../report/")+Str_Filename+".xls");//生成新的文件;
StreamWriter Srd =new StreamWriter(Server.MapPath("../report/")+FN.Name.ToString(),false);//建立写的内存流;
Srd.WriteLine(test);
Srd.Close();
Response.Write(" ");

(四)
1、降低服务器负荷
只从数据源提取所需数据,不应把所有的数据一股脑全取出来;
尽可能使用客户端的状态管理来存取数据;
2、数据绑定
绑定到简单属性: 产品编号:<%#PuroductID%>
绑定到集合(数组): 员工姓名:<asp:DropDownList id="Drop1" datasource='<%#MYArry%>' runat="server">
绑定到表达式: 邮寄地址:<%#(customer.Zip+" "+customer.Address)%>
绑定到方法所返回的结果:应缴税额:<%#GetTax(Salary)%>
绑定到数据源: <asp:TextBox id="TextBox1" runat="server" Text='<%#DataView1(0)["view_name"]%>'>
</asp:TextBox>
绑定到数据源: <asp:TextBox id="Image1" runat="server" ImageUrl='<%#DataView(0)["PhotoURL"]%>'>
</asp:Image>
3、用控件的value属性对控件进行关联
示例:一个下拉列表框DropDownList,一个文本标签Label,一个图片容器Image。
实现的功能:当选择下拉列表框的商品时,在图片容器中显示出相关商品的图片,并在文本标签中显示出商品的名称。
实现的方法: a、将DropDownList控件的DataTextField属性和DataValueField属性分别绑定到相应的字段;
b、将Label的Text属性绑定到DropDownList的SelectItem.Text属性;
c、将Image的ImageUrl属性绑定到DropDownList的SelectItem.Value属性:
4、善用DataBinder类进行数据绑定
数据绑定的两种方法:(推荐用第二种方法)
a、<%#string.Format("{0:c}",((System.Data.Common.DbDataRecord).Container.DataItem)["view_salary"])%>
b、<%#DataBinder.Eval(Container.DataItem,"view_salary","{0:c}")%>
DataBinder.Eval的三个参数的意义分别是:数据项的命名容器,数据字段名称和格式字符串;
说明:“数据项命名容器”在DataList,DataGrid,ListBox,DropDownList等能显示多笔数据的服务器控件的模板中,数据项的名称永远是Container.DataItem,其中Container代表绑定至数据应的父控件,DataItem代表父控件目前正在处理的数据记录。
“格式字符串”{0:c}--货币型显示;{0:d}--日期形显示;
5、绑定多条数据的web控件(DropDownList,ListBox,RadioButtonList,CheckBoxList,DataGrid,DataList等)的数据绑定步骤:
a、将DataSource属性设定成要绑定的数据源;将DataMember属性设定成要绑定的的数据表或数据字段的名称;
b、将DataKeyField属性设置为唯一标识每条记录的字段名称,一般就是数据源的主关键索引字;
c、如果使用的是DropDownList,ListBox,RadioButtonList,CheckBoxList,将DataTextField属性设置为其数据内容要显示于控件中的字段名;
d、如果使用的是DropDownList,ListBox,RadioButtonList,CheckBoxList,可以将DataValueField属性设置成某个字段名作关系值;
e、调用DataBind方法;
6、超级链接列用法介绍:(P260表6-25)
a、Text和DataTextField属性:
Text属性(文本):要想使超级链接列的各行有相同的标题文本,用Text属性设置。如在每一行的开头设一列名称都是“详细查看”。
DataTextField属性(文本字段):每一行中显示数据库中相应字段的内容,并且内容本身就是一个超级链接。如用每个人的身份证号码链接其详细情况页面。
b、NavigateUrl和NavigateUrlField属性:
NavigateUrl属性(URL):要想使超级链接列的各行超级链接指向一个目标,用NavigateUrl设置。
DataNavigateUrlField属性(URL字段):每一行超级链接的目标为数据库中的某个字段中所指定的超链接地址,用DataNavigateUrlField设置。
c、DataTextFormatString和DataNavigateUrlFormatString属性:
DataTextFormateString属性(文本格式字符串):设置每一行超链接文本的显示格式。
DataNavigateUrlFormatString属性(URL格式字符串):指定超链接字符串格式。如:../list.aspx?cad={0}。
d、ReadOnly和Visible属性:分别设置超链接列是否为可见和只读;
e、Target属性(目标):指定目标窗口或目标框架。_blank, _parent, _self, _top。
f、HeaderText和FooterText属性:分别设置页眉(每一列的标题)和页脚。

示列:假高员工照片以“Employee-员工身份证号.jpg”存放在images目录下,点击“查看照片”超链接时就能够显示出员工照片。
实现: 将超链接列的Text属性设置为“查看照片”。Text="查看照片";
将超链接列的DataNavigateUrlField设置为身份证号码所在的列名。DataNavigateUrlField="view_caid";
将超链接列的DataNavigateUrlFormatString设置为"Detail.aspx?cad=images/Employee-{0}.jpg";
7、按钮字段列用法介绍:(P266图6-31)
a、CommandName(命令名)属性:如果有两列或两列以上的按钮字段,在DataGrid控件的ItemCommand事件中,用CommandName可以区分是按了哪一列的按钮。
b、DataTextField(文本字段)属性:将按钮列的每一行的按钮标题绑定到数据库的字段;
c、Text(文本)属性:如果要想使所有的按钮标题都是一样的文字,则用Text属性来设定按钮标题。
d、ButtonType(按钮类型)属性:可以是链接按钮,也可以是命令按钮;
e、HeaderText和FooterText属性:分别设置页眉(每一列的标题)和页脚。
f、Visible属性:设置按钮列是否为可见;

说明:
a、单击按钮列的命令按钮时,会引发DataGrid的ItemCommand事件,因此,各个命令按钮所要执行的操作必需写在ItemCommand事件处理程序中。
b、ItemCommand事件的第二个参数是DataGridCommandEventArgs对象,DataGridCommandEventArgs对象有两个常用的属性:CommandName和Item.Cells
e.CommandName 用来判断那一列的按钮字段被按下了。
e.Item.Cells[<IndexNo>] 用来取得被按下的按钮所在行的各字段数据;
8、模板列用法介绍:
加入模板列的按钮会将其Click事件返升至DataGrid服务器控件的ItemCommand事件。这意味着,当按钮被按下时将会引发DataGrid服务器控件的ItemCommand事件,为了在ItemCommand事件中判断哪一个按钮被按下,必须设置按钮的CommandName属性。
9、编辑命令列介绍(编辑、更新、取消):
a、用编辑命令列必须要为DataGrid服务器控件指定DataKeyField属性,设置到数据表的主索引字段。这里的DataKeyField属性所指定的主索引键字段内容会被填入DataGrid服务器控件的DataKeys集合中。所以可以用下列方法取得主索引值:
MyCommand.Parameters["@uid"].Value=DataGrid1.DataKeys[e.Item.ItemIndex];
b、当用户按下了“编辑”按钮时,便会引发DataGrid服务器控件的EditCommand事件,必须在此事件中将行编号指派给EditItemIndex;
在EditCommand事件中的第二个参数是DataGridCommandEventArgs对象,通过它的Item.ItemIndex属性可以取得行编号。代码如下:
DataGrid1.EditItemIndex=e.Item.ItemIndex;
c、当用户按下了“取消”按钮时,便会引发DataGrid服务器控件的CancelCommand事件,只需在CancelCommand事件处理程序中将EditItemIndex属性设置为-1来使数据跳出编辑模式,然后重看绑定DataGrid控件;
d、当用户按下了“更新”按钮时,便会引发DataGrid服务器控件的UpdateCommand事件,在其中编写相应的更新代码即可;
10、编辑命令列集成模板编辑列:(P286图6-54 图6-55 图6-56)
a、分别设定"ItemTemplate"和"EditItemTemplate",并进行数据绑定。
b、绑定“性别”列:将其Checked属性设置如下:
Checked='<%#DataBinder.Eval(Container.DataItem,"view_sex")%>';
c、绑定“血型”型:将其SelectedIndex属性设置如下:
SelectedIndex='<%#GetBloodTypeIndex(DataBinder.Eval(Container.DataItem,"view_bloodtype").ToString)%>'
d、在UpdateCommand事件处理中,要取得编辑后的数据,必须使用FindControl找到这两个控件并取得数值。代码如下所示:
// 取得主索引键之值(此处为身份证号码)
MyCommand.Parameters["@uid"].Value = StudentDataGrid.DataKeys[e.Item.ItemIndex];

string[] Cols = new string[] {"@uid", "@SName", "@Gender", "@PName", "@BloodType", "@Height", "@Weight"};

// 取得 TableCell 物件的数目,也就是每一数据列之储存格的数目(等於 DataGrid 伺服器控制项中数据行的数目)
int NumCols = e.Item.Cells.Count;

// 此回圈会将各字段(储存格)或控制项的数据指派给 UPDATE 命令中的参数。
// 略过第一栏与第二栏,因为第一栏是按钮,第二栏的身份证号码则已在之前取得。
for (int i = 2; i<=NumCols - 1; i++)
{
switch (i)
{
case 3: // 第 4 个字段(储存格)

// 由於第 4 个字段「性别」是使用样板数据行中名称为 GenderCheckBox
// 的核取方块来编辑,因此必须先使用 FindControl 方法
// 找到此核取方块, 并判断它是否被勾选将,然後才将
// 1 或 0 指派给参数 @Gender 。
CheckBox GenderCheckBox;
GenderCheckBox = (CheckBox)e.Item.FindControl("GenderCheckBox");

if (GenderCheckBox.Checked == true)
MyCommand.Parameters["@Gender"].Value = 1;
else
MyCommand.Parameters["@Gender"].Value = 0;

break;

case 5: // 第 6 个字段(储存格)

// 由於第 6 个字段「血型」是使用样板数据行中名称为 BloodTypeDropList
// 的下拉式清单来编辑,因此必须先使用 FindControl 方法
// 找到此下拉式清单, 并将使用者所选取的选项指派给参数 @BloodType 。
DropDownList BloodTypeDropList;
BloodTypeDropList = (DropDownList)e.Item.FindControl("BloodTypeDropList");
MyCommand.Parameters["@BloodType"].Value = BloodTypeDropList.SelectedItem.ToString();

break;

default:

TextBox CurrentTextBox = (TextBox)e.Item.Cells[i].Controls[0];
string ColValue = CurrentTextBox.Text;

// 检查字段(储存格)的内容是否为 Null 值
if (ColValue == "")
{
Message.Text = "错误: 每一个字段都必须输入数据不允许 Null 值!";
return;
}
MyCommand.Parameters[Cols[i - 1]].Value = ColValue;

break;
}
}
11、删除数据列简介:
按下“删除”按钮引发DeleteCommand事件,在DeleteCommand事件中用e.Item.ItemIndex属性来识别要删除的行。但务必要将CommandName设置成Delete;
12、排序数据:DataGrid有“默认排序”和“自定义排序”两种方法。
默认排序:将DataGrid所有列的标题都变成超链接按钮,当点击列标题时就对相应的列进行排序。
a、将DataGrid服务器控件的AutoGenerateColumns属性设置成True;
b、将DataGrid服务器控件的AllowSorting属性设置为True;
c、当按下标题链接按钮时,就会激发DataGrid控件的SortCommand事件。在SortCommand事件中第二个参数就是DataGridSortCommandEventArgs对象,此对像的SortExpression属性持有DataGrid控件的表达式,将此属性绑定到数据源的Sort属性;代码如下:
private void DataGrid1_SortCommand(object source,System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
DataView Source=ds.Tables["info_basic"].DefaultView;
Source.Sort=e.SortExpression.ToString();
……
}
自定义排序:将特定的列显标题显示为排序按钮。
a、将DataGrid服务器控件的AutoGenerateColumns属性设置成False;
b、将DataGrid服务器控件的AllowSorting属性设置为True;
c、在属性生成器的窗口中填加列,并对要排序的列选择“排序表达式”。
d、在SortCommand事件处理程序中编写代码:Source.Sort=e.SortExpression.ToString();。

注:如果排序的列表题用的是模板列中按钮,则:须将CommandArgument属性设置成排序的表达式,将CommandName属性设置成sort。
13、分页查看:
AllowPaging=true --允许分行。
PageSize --页面大小。
DataGrid1.PageStyle.Mode=PagerMode.NextPrev; --“上一页”“下一页”的导航模式。
DataGrid1.PageStyle.Mode=PagerMode.NumericPages;--页码形式的导航模式;
CurrentPageIndex --当前的页次;
PageCount --页面总数;
a、默认导航按钮默认分页模式:采用系统内置的导航按钮和默认的分页模式。在“属性生成器”中可以直接进行设置;
在页面导航时激发PageIndexChanged事件,应在该事件中加下页面切换的相关代码。代码如下:
{
DataGrid1.CurrentPageIndex=e.NewPageIndex;
BindGridSource();//自定义的数据绑定函数;
}
b、自定义导航按钮默认分页模式:导航按钮用Button,LinkButton或ImageButton来实现,自定义导航按钮与内置导航按钮可以并存。
示例:有四个导航按钮“第一页”“上一页”“下一页”“最后一页”,进行导航。
实现: (1)分别设置四个按钮的CommandName为:“第一页”“上一页”“下一页”“最后一页”;
(2)将四个按钮的Click事件都绑定到NavigateToPage方法。
this.btnFirstPage.Click += new System.EventHandler(this.NavigateToPage);
this.btnPreviousPage.Click += new System.EventHandler(this.NavigateToPage);
this.btnNextPage.Click += new System.EventHandler(this.NavigateToPage);
this.btnLastPage.Click += new System.EventHandler(this.NavigateToPage);
(3)编写NavigateToPage方法的代码。
private void NavigateToPage(object sender, System.EventArgs e)
{
string PageInfo = ((Button)sender).CommandName;
switch (PageInfo)
{
case "第一页":
EmployeeDataGrid.CurrentPageIndex = 0;
break;
case "上一页":
if (EmployeeDataGrid.CurrentPageIndex > 0)
EmployeeDataGrid.CurrentPageIndex -= 1;
break;
case "下一页":
if (EmployeeDataGrid.CurrentPageIndex < (EmployeeDataGrid.PageCount - 1))
EmployeeDataGrid.CurrentPageIndex += 1;
break;
case "最后一页":
EmployeeDataGrid.CurrentPageIndex = (EmployeeDataGrid.PageCount - 1);
break;
}

// 重新绑定至数据来源
BindGridToSource();
}
c、自定义分页(自定义导航按钮自定义分页模式):不要一次从数据源取出所有的记录,而只提取显示于页面的数据记录;
自定义导航按钮如上一步所示(略);只是调用的BindGridToSource()函数变为两个参数,第一个参数是:当前页的第一条记录(当前页次*每页记录数)。第二个参数是:导航按钮的标识PageInfo(即CommandName)。
自定义分面主要代码如下图所示。(假设每页只有5条记录)
private void BindGridToSource(int StartPosition, string GoToPage)
{
……
switch (GoToPage)
{
case "上一页":
MyCommand = new SqlCommand("SELECT TOP 5 … FROM … WHERE 身份证号码 >= @uid ORDER BY 身份证号码", MyConnection);
if (StartPosition == 0)
MyCommand.Parameters.Add("@uid", SqlDbType.NVarChar, 18).Value = "";
else
//ViewState视图状态中存有上一页的第一条记录的前一记录。
MyCommand.Parameters.Add("@uid", SqlDbType.NVarChar, 18).Value = ViewState[(EmployeeDataGrid.CurrentPageIndex + 1).ToString()];

break;

case "下一页":
MyCommand = new SqlCommand("SELECT TOP 5 … FROM … WHERE 身份证号码 > @uid ORDER BY 身份证号码", MyConnection);
//取出当前面的最后一条记录;
MyCommand.Parameters.Add("@uid", SqlDbType.NVarChar, 18).Value = EmployeeDataGrid.Items[4].Cells[0].Text;

break;
}

MyConnection.Open();
SqlDataReader dr = MyCommand.ExecuteReader();
EmployeeDataGrid.DataSource = dr;
EmployeeDataGrid.DataBind();
dr.Close();
MyConnection.Close();
//用不同的视图状态保存浏览过的所有页面的最后一条记录。
ViewState[(EmployeeDataGrid.CurrentPageIndex + 1).ToString()] = EmployeeDataGrid.Items[0].Cells[0].Text;
ShowPageStatus(EmployeeDataGrid.VirtualItemCount);
}
同样可以编写页码导航方式的自定义分页。可以采用形式如:“跳转到第__页”,根据用户在文本框中填入的数据计算出要跳转的页面的记录。