第一步:访问数据是做程序必不可少的一步。首先创建SQL ServerManagement Studio2005使用脚本创建名为“MyBookDB”的数据库!脚本如下:
具体代码如下:
use master
go
if exists(select * from sys.databases wherename = 'MyBookDB')
drop database MyBookDB
go
create database MyBookDB
on primary
(
name = 'MyBookDB',
fileName = 'C:\MyBookDB.mdf'
)
log on
(
name = 'MyBookDB_log',
filename = 'C:\MyBookDB.ldf'
)
go
use MyBookDB
go
if exists(select * from sys.objects wherename='Book')
droptable Book
go
create table Book
(
BookID int identity(1,1) not null,
Title nvarchar(50) not null,
AuthorName varchar(50) not null,
Publish nvarchar(100) not null,
Price float not null,
PubDate datetime not null
);
alter table Book add constraint PK_BookIDprimary key(BookID);
alter table Book add constraint UQ_Titleunique(Title);
insert into Book values('C++程序设计','于公','清华大学出版社',35.6,'2007-12-01 10:26:00')
insert into Book values('Basic语言程序设计','刘伟','清华大学出版社',25.1,'2005-09-01 16:15:00')
insert into Book values('操作系统原理','张维民','高等教育出版社',29.3,'2006-01-02 09:30:00')
insert into Book values('ASP.NET3.5开发指南','谢敏','科学出版社',56.8,'2008-08-08 08:30:00')
insert into Book values('Java编程思想','黄超','机械工业出版社',65.6,'2006-09-05 12:30:00')
insert into Book values('UML2.0学习指南','李健','清华大学出版社',32.5,'2007-08-15 13:00:45')
具体效果如图:
插入几条测试数据:
OK,查询一下数据库,如图:
第二步:由于本人是用Linq作为数据访问,选中项目,右击,在弹出的下拉选项中选择“添加新项(W)….”,
之后在弹出的对话框中选择“LINQto SQL类”模板,在名称文本框中输入Book.dbml,
点击 “添加”,接着会弹出如下的对话框:
我们一般在不采用分层的情况下,数据文件通常会放在 “App_Code”文件夹,便于管理,所以我们选择“是(Y)”,整个项目的效果如下:
第三步:点击Book.dbml文件中的“服务器资源管理器”,
或者选择“视图”菜单,找到“服务器资源管理器(V) Ctrl+W,L”选项,
也可以按住快捷键“Ctrl+Alt+S”,打开“服务器资源管理器”视图,如图所示:
右键单击“数据库连接”,选择“添加连接(A)…”
在弹出的对话框中选择“MicrosoftSQL Server”
单击“继续”后,出现”添加连接”对话框,由于登录数据库时,是以本机作为服务器,以Windows身份进行登录,所以在“服务器名”下拉框中键入英文点“.”,代表本机,在“登录到服务器”组中,选择“使用Windows身份验证(W)”单选按钮,在“连接到一个数据库”组中,选择“选择或输入一个数据库名(D):”单选按钮,在下拉框选项中选择“MyBookDB”数据库,
单击“测试连接(T)”,测试连接成功!
,单击“确定”→“确定”,后展开数据库下的表,
将整个表拖放至“App_Code/Book.dbml”文件中。
第三部,进行正式的手动编码!
前台“Default.aspx”页面中的代码如下:
具体为:
<%@ PageLanguage="C#"AutoEventWireup="true"EnableEventValidation="false" CodeFile="Default.aspx.cs" Inherits="_Default"%>
<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
div
{
font-size:13px;
text-align:center;
}
a
{
text-decoration:none;
color:#666;
}
</style>
</head>
<body>
<form id="myform" runat="server">
<asp:ScriptManager ID="smBook" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="upnlBook" runat="server">
<ContentTemplate>
<asp:LinkButton ID="btnDeleteAll" runat="server" Text="批量删除" OnClientClick="returnconfirm('您确定要删除吗?');"
οnclick="btnDelete_Click"></asp:LinkButton>
<br /><br />
<div>
<asp:GridView ID="gvBook" runat="server" AutoGenerateColumns="False"
Width="60%" onrowcreated="gvBook_RowCreated">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="chkHeader"runat="server"oncheckedchanged="chkHeader_CheckedChanged"AutoPostBack="true"/>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="chkItem"runat="server"oncheckedchanged="chkItem_CheckedChanged"AutoPostBack="true"/>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="编号">
<ItemTemplate>
<asp:Label ID="lblNo" runat="server"Text='<%#Eval("BookID")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Title" HeaderText="书名" />
<asp:BoundField DataField="AuthorName" HeaderText="作者"/>
<asp:BoundField DataField="Publish" HeaderText="出版社" />
<asp:BoundField DataField="Price" HeaderText="价格" />
<asp:BoundField DataField="PubDate" HeaderText="出版时间" />
</Columns>
<SelectedRowStyle BackColor="#D1DDF1" ForeColor="#333333" Font-Bold="True" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#99C89D"Font-Bold="True"ForeColor="White"/>
<AlternatingRowStyle BackColor="White" />
<RowStyle BackColor="#EFF3FB" />
</asp:GridView>
</div>
<div style="margin-top:5px;">
<asp:LinkButton ID="btnFirst" runat="server" Text="首页" οnclick="btnFirst_Click"></asp:LinkButton>
<asp:LinkButton ID="btnPrev" runat="server" Text="上一页" οnclick="btnPrev_Click"></asp:LinkButton>
<asp:LinkButton ID="btnNext" runat="server" Text="下一页" οnclick="btnNext_Click"></asp:LinkButton>
<asp:LinkButton ID="btnLast" runat="server" Text="尾页" οnclick="btnLast_Click"></asp:LinkButton>
</div>
第<asp:Label ID="lblCurrent"runat="server"Text="1"ForeColor="Red"></asp:Label>页
共<asp:Label ID="lblTotalPage"runat="server"ForeColor="Red"></asp:Label>页
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
注意:页面中要设置每个复选框的AutoPostBack属性为true.
Default页面的后台代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
using System.Web.UI;
usingSystem.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
BookDataContextdataContext = new BookDataContext();
protected void Page_Load(objectsender, EventArgs e)
{
if(!IsPostBack)
{
ShowAllBooks();
ViewState.Clear(); //清空ViewState中的所有项
}
}
/// <summary>
/// 显示所有书本信息
/// </summary>
private void ShowAllBooks()
{
IList<Book> books = dataContext.Book.ToList<Book>(); //通过Linq的ToList<T>操作符,获取数据库中所有图书的集合
PagedDataSourcepagedDataSource = new PagedDataSource();//声明一个PagedDataSource分页类
pagedDataSource.DataSource =books; //将PagedDataSource的DataSource属性设置为books集合
pagedDataSource.AllowPaging = true; //允许分页
intcurrentPage = Convert.ToInt32(lblCurrent.Text)- 1; //获取当前的页数,再减去一,因为PagedDataSource的当前页是像从0开始
pagedDataSource.CurrentPageIndex =currentPage; //为pagedDataSource指定当前页
pagedDataSource.PageSize = 2; //设置每页显示记录数,这里设置2条,读者可以根据自己的需要进行设置
lblTotalPage.Text =pagedDataSource.PageCount.ToString();//获取总页数
btnFirst.Enabled = true; //将“首页”按钮设置为启用状态
btnNext.Enabled = true; //将“下一页”按钮设置为启用状态
btnPrev.Enabled = true; //将“上一页”按钮设置为启用状态
btnLast.Enabled = true; //将“尾页”按钮设置为启用状态
if(pagedDataSource.IsFirstPage) //如果当前是第一页
{
btnFirst.Enabled = false; //禁用“首页”按钮
btnPrev.Enabled = false; //禁用“上一页”按钮
}
if(pagedDataSource.IsLastPage) //如果当前是最后一页
{
btnNext.Enabled = false; //禁用“下一页”按钮
btnLast.Enabled = false; //禁用“尾页”按钮
}
if(books.Count > 0) //如果数据库中有记录
gvBook.DataSource =pagedDataSource; //则为GridView控件指定数据源
gvBook.DataBind(); //调用DataBind()方法,对数据进行绑定
AddValue();
}
/// <summary>
/// 为GridView模板中的每个复选框添加一个Id属性,用于进行唯一标识
/// </summary>
private void AddValue()
{
foreach(GridViewRow row ingvBook.Rows) //遍历GridView中的每一行
{
CheckBoxbox = (CheckBox)row.FindControl("chkItem"); //获取项模版中的每一个复选框
LabellblNo = (Label)row.FindControl("lblNo"); //获取每一项中的保存图书编号的Label标签
if(box != null && lblNo != null)
{
stringbookId = lblNo.Text; //获取图书的编号
box.Attributes.Add("id", bookId); //为复选框添加一个自定义的id属性,属性值为当前的图书编号
IList<int> idArray = newList<int>(); //声明一个变量,保存选中的所有的图书编号的集合
if(ViewState["BookIDArray"] != null)
idArray = (List<int>)ViewState["BookIDArray"];
if(idArray.Contains(Convert.ToInt32(bookId))) //如果图书编号的集合中保存有当前的图书编号
box.Checked = true; //则将当前的复选框设置为选中状态
else
box.Checked = false; //否则设置为不选中
}
}
}
/// <summary>
/// 单击“首页”按钮,显示第一页的数据
/// </summary>
protected void btnFirst_Click(objectsender, EventArgs e)
{
lblCurrent.Text = "1"; //将当前的页数设置为1
ShowAllBooks(); //调用显示所有图书信息的方法
}
/// <summary>
/// 单击“上一页”按钮,显示上一页的数据
/// </summary>
protected void btnPrev_Click(objectsender, EventArgs e)
{
intcurrentPage = Convert.ToInt32(lblCurrent.Text);//获取当前的页数
if(currentPage <= 1) //如果当前的页数小于或者等于1
currentPage = 2; //则将当前的页数设置为2
currentPage = currentPage - 1; //将当前的页数在原来的基础上减去1
lblCurrent.Text =currentPage.ToString(); //将当前的页数显示在页面的lblCurrent控件中
ShowAllBooks(); //调用显示所有图书信息的方法
}
/// <summary>
/// 单击“下一页”按钮,显示下一页的数据
/// </summary>
protected void btnNext_Click(objectsender, EventArgs e)
{
intcurrentPage = Convert.ToInt32(lblCurrent.Text);//获取当前的页数
inttotalPage = Convert.ToInt32(lblTotalPage.Text);//获取总页数
if(currentPage >= totalPage)//如果当前的页数大于或者等于总页数
currentPage = totalPage - 1; //则将当前的页数设置为总页数减1
currentPage = currentPage + 1; //将当前的页数在原来的基础上加上1
lblCurrent.Text = currentPage.ToString();//将当前的页数显示在页面的lblCurrent控件中
ShowAllBooks(); //调用显示所有图书信息的方法
}
/// <summary>
/// 单击“尾页”按钮,显示最后一页的数据
/// </summary>
protected void btnLast_Click(objectsender, EventArgs e)
{
lblCurrent.Text = lblTotalPage.Text; //将当前页数设置为与总页数相等
ShowAllBooks(); //调用显示所有图书信息的方法
}
/// <summary>
/// GridView控件头部中的复选框的改变事件
/// </summary>
protected void chkHeader_CheckedChanged(object sender, EventArgs e)
{
boolisCheck = ((CheckBox)sender).Checked; //获取复选框的选中状态
if(isCheck)
{
//使用Linq的Select操作符,查询出数据库中所有图书编号的集合
IList<int> idArray = dataContext.Book.Select(b =>b.BookID).ToList<int>();
ViewState["BookIDArray"]= idArray; //保存所有的图书编号
ViewState["CheckMode"]= "CheckAll"; //当前为全选状态
foreach(GridViewRow row ingvBook.Rows) //遍历GridView中的每一行
{
CheckBoxbox = (CheckBox)row.FindControl("chkItem"); //获取每行中CheckBox控件
if(box != null)
box.Checked = true; //因为当前为“全选”状态,将行中的每一个复选框设置为“选中”状态
}
}
else
{
ViewState.Remove("BookIDArray"); //清空图书编号的集合
ViewState["CheckMode"]= "NotCheckAll"; //当前不是全选状态
foreach(GridViewRow row ingvBook.Rows) //遍历GridView中的每一行
{
CheckBoxbox = (CheckBox)row.FindControl("chkItem"); //获取每行中CheckBox控件
if(box != null)
box.Checked = false; //因为当前为“反选”状态,将行中的每一个复选框设置为“不选中”状态
}
}
}
/// <summary>
/// GridView控件行中的复选框的改变事件
/// </summary>
protected void chkItem_CheckedChanged(objectsender, EventArgs e)
{
IList<int> idArray = newList<int>(); //声明一个变量,保存选中的图书编号的集合
if(ViewState["BookIDArray"] != null)
idArray = (List<int>)ViewState["BookIDArray"];
intbookId = Convert.ToInt32(((CheckBox)sender).Attributes["id"]); //获取当前行中的图书的编号
boolisChecked = ((CheckBox)sender).Checked; //获取当前行中的复选框是否为被选中的状态
if(isChecked) //如果当前行中的复选框被选中
{
if(idArray.Contains(bookId) == false)//如果图书编号集合中不包含当前选中的图书的编号
idArray.Add(bookId); //则往集合中添加该图书的编号
}
else //如果当前行中的复选框没有被选中
{
if(idArray.Contains(bookId))//如果图书编号集合中包含当前选中的图书的编号
idArray.Remove(bookId); //则将该图书的编号从集合中删除
}
ViewState["BookIDArray"]= idArray; //将选中的图书编号的集合保存到ViewState["BookIDArray"]中
}
/// <summary>
/// GridView控件的行的创建事件,在创建行时,判断是否是“全选”状态
/// 如果是,则将头部模板中的复选框选中
/// </summary>
protected void gvBook_RowCreated(objectsender, GridViewRowEventArgs e)
{
if(ViewState["CheckMode"] != null)
{
stringmode = ViewState["CheckMode"].ToString(); //获取是否为“全选”状态的标识
if(mode == "CheckAll") //如果为全选状态
{
CheckBoxbox = (CheckBox)e.Row.FindControl("chkHeader"); //找到头部模板中的复选框
if(box != null)
{
box.Checked = true; //将复选框置为选中的状态
}
}
}
}
/// <summary>
/// 单击"批量删除"按钮,删除选中的图书
/// </summary>
protected void btnDelete_Click(objectsender, EventArgs e)
{
if(ViewState["BookIDArray"] != null)
{
IList<int> array = (List<int>)ViewState["BookIDArray"];//获取选中的图书编号的集合
if(array.Count > 0)
{
IList<int> removes = newList<int>();//声明一个变量,保存刚刚删除的图书编号的集合
removes.Clear(); //清空集合中的所有项
foreach(int bookId inarray) //遍历得到每一本图书的编号
{
DeleteBookByBookId(bookId);//删除图书的新明
removes.Add(bookId); //往集合中添加刚刚删除的图书编号
}
lblCurrent.Text = "1";
foreach(int bookId inremoves) //循环遍历每一本刚刚删除图书的编号
{
array.Remove(bookId); //将图书的编号从选中的图书编号的集合中删除
}
if(array.Count < 1) //选中的图书编号的集合的元素个数小于1
ViewState.Remove("BookIDArray"); //清空选中的图书编号的集合
ShowAllBooks(); //重新显示所有的图书信息
}
}
else
//如果用户没有选中任何图书,则弹出“选择”的提示对话框
ScriptManager.RegisterStartupScript(this, typeof(string), "key","alert('请选择要删除的图书!');", true);
}
/// <summary>
/// 根据图书的编号,删除图书的信息
/// </summary>
/// <paramname="bookId">图书的编号</param>
private void DeleteBookByBookId(intbookId)
{
Bookbook = dataContext.Book.SingleOrDefault<Book>(b=> b.BookID == bookId); //根据图书的编号,获得图书实体对象
if(book != null) //如果该本图书不为空
{
dataContext.Book.DeleteOnSubmit(book); //通过Linq的DeleteOnSubmit操作符,将该图书丛数据库中删除
dataContext.SubmitChanges(); //调用DataContext的SubmitChanges()方法,将数据提交到数据库中
}
}
}
Repeater、DataList控件的用法也大同大同小异,只是遍历控件的方法有所区别!
OK,收工,运行页面,如果所示:
读者可以根据自行测试!如有不足或错误之处欢迎您提出宝贵的建议,不胜感激,Thank You!