实现GridView的插入功能
一、引言
GridView控件本身没有插入功能,然而,我们可以另辟蹊径,使之具有插入的功能。本文通过一个简单的Demo,讲述了一种实现插入的方法。该Demo中GridView相关的操作全部用后台代码实现,而不是用DataSource控件。
二、项目使用的数据库
使用的数据库非常简单,一张用户表User和角色表Role,直接copy SQL代码了:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CREATE TABLE [Role] (
2 RoleID INT IDENTITY PRIMARY KEY,
3 [Name] VARCHAR(20) NOT NULL
4 )
5 CREATE TABLE [User] (
6 UserID INT IDENTITY PRIMARY KEY,
7 [Name] NCHAR(20) UNIQUE NOT NULL,
8 Password CHAR(32) NOT NULL,
9 Gender CHAR(1) NOT NULL,
10 RoleID INT NOT NULL
11 CONSTRAINT FK_User_Role FOREIGN KEY(RoleID) REFERENCES [Role](RoleID)
12 )
2 RoleID INT IDENTITY PRIMARY KEY,
3 [Name] VARCHAR(20) NOT NULL
4 )
5 CREATE TABLE [User] (
6 UserID INT IDENTITY PRIMARY KEY,
7 [Name] NCHAR(20) UNIQUE NOT NULL,
8 Password CHAR(32) NOT NULL,
9 Gender CHAR(1) NOT NULL,
10 RoleID INT NOT NULL
11 CONSTRAINT FK_User_Role FOREIGN KEY(RoleID) REFERENCES [Role](RoleID)
12 )
三、Demo设计
1、直接贴截图了。界面很简单,对GridVeiw启用了分页和排序功能。
2、后台代码中插入按钮的Click事件代码为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 protected void btn_Insert_Click(object sender, EventArgs e)
2 {
3 //取出需要的视图dv。考虑到这只是简单Demo,就不分层写了,代码全写成一坨了。
4 SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);
5 string command = "SELECT [User].*, [Role].[Name] FROM [User] JOIN [Role] ON [User].RoleID = [Role].RoleID";
6 connection.Open();
7 SqlDataAdapter dataAdapter = new SqlDataAdapter(command, connection);
8 DataSet dataSet = new DataSet();
9 dataAdapter.Fill(dataSet);
10 DataView dv = dataSet.Tables[0].DefaultView;
11
12 //进行排序
13 if (ViewState["Direction"] != null && ViewState["Expression"] != null)
14 dv.Sort = ViewState["Expression"].ToString() + " " + ViewState["Direction"].ToString();
15
16 DataTable dt = dv.ToTable(); //排序后的视图转化为表dt
17 DataRow dr = dt.NewRow();
18 dt.Rows.InsertAt(dr, 0);//把new出来的新行插入在表的第一行
19 dv = dt.DefaultView; //再把表转化为视图
20
21 //GridView名字这里是gv
22 gv.EditIndex = 0;
23 gv.PageIndex = 0;
24 gv.DataSource = dv;
25 gv.DataKeyNames = new string[] { "UserID" };
26 gv.DataBind();
27
28 //下面这句注意了:原来GridView处于编辑状态的话,button上默认不是显示 '增加' 而是 '编辑',这里改下。
29 (gv.Rows[0].Cells[4].Controls[0] as LinkButton).Text = "增加";
30 }
2 {
3 //取出需要的视图dv。考虑到这只是简单Demo,就不分层写了,代码全写成一坨了。
4 SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);
5 string command = "SELECT [User].*, [Role].[Name] FROM [User] JOIN [Role] ON [User].RoleID = [Role].RoleID";
6 connection.Open();
7 SqlDataAdapter dataAdapter = new SqlDataAdapter(command, connection);
8 DataSet dataSet = new DataSet();
9 dataAdapter.Fill(dataSet);
10 DataView dv = dataSet.Tables[0].DefaultView;
11
12 //进行排序
13 if (ViewState["Direction"] != null && ViewState["Expression"] != null)
14 dv.Sort = ViewState["Expression"].ToString() + " " + ViewState["Direction"].ToString();
15
16 DataTable dt = dv.ToTable(); //排序后的视图转化为表dt
17 DataRow dr = dt.NewRow();
18 dt.Rows.InsertAt(dr, 0);//把new出来的新行插入在表的第一行
19 dv = dt.DefaultView; //再把表转化为视图
20
21 //GridView名字这里是gv
22 gv.EditIndex = 0;
23 gv.PageIndex = 0;
24 gv.DataSource = dv;
25 gv.DataKeyNames = new string[] { "UserID" };
26 gv.DataBind();
27
28 //下面这句注意了:原来GridView处于编辑状态的话,button上默认不是显示 '增加' 而是 '编辑',这里改下。
29 (gv.Rows[0].Cells[4].Controls[0] as LinkButton).Text = "增加";
30 }
3、然后在GridView的Updating事件里面写代码,里面需要插入状态的代码,下面给出代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 protected void gv_RowUpdating(object sender, GridViewUpdatedEventArgs e)
2 {
3 //确定是否处于插入状态
4 bool IsInsert = (gv.Rows[0].Cells[4].Controls[0] as LinkButton).Text == "增加" ? true : false;
5
6 //因为这个Demo有性别和角色,所以用到了RadioButtonList和DropDownList,这里取到控件。
7 RadioButtonList rbl = gv.Rows[e.RowIndex].FindControl("rbl_Gender") as RadioButtonList;
8 DropDownList ddl = gv.Rows[e.RowIndex].FindControl("ddl_RoleName") as DropDownList;
9
10 //下面确定需要插入或者编辑的字段
11 string userId = IsInsert ?
12 (gv.Rows[0].FindControl("txt_UserId") as TextBox).Text.Trim() :
13 gv.DataKeys[0]["UserId"].ToString();
14 string name = (gv.Rows[e.RowIndex].FindControl("txt_Name") as TextBox).Text.Trim(); //错误1 cells[0-1]
15 string gender = rbl.SelectedItem.Value;
16 string password = "123"; //插入新的用户时,默认密码为123
17 int roleId = Convert.ToInt32(ddl.SelectedItem.Value);
18
19 //以下进行插入或者编辑操作,因为原本是三层架构的Demo,所以这里就不写一坨了,本文重点也不在这里。
20 if (IsInsert)
21 {
22 UserEntity user = new UserInfo(userId, name, gender, password, roleId);
23 user.InsertUser(user);
24 }
25 else
26 {
27 UserEntity user = new UserEntity(userId);
28 user.Name = name;
29 user.Gender = gender;
30 user.RoleId = roleId;
31 user.UpdateUser(user);
32 }
33
34 gv.EditIndex = -1;
35 gv_DataBind(); //调用自定义的事件绑定函数
36 }
2 {
3 //确定是否处于插入状态
4 bool IsInsert = (gv.Rows[0].Cells[4].Controls[0] as LinkButton).Text == "增加" ? true : false;
5
6 //因为这个Demo有性别和角色,所以用到了RadioButtonList和DropDownList,这里取到控件。
7 RadioButtonList rbl = gv.Rows[e.RowIndex].FindControl("rbl_Gender") as RadioButtonList;
8 DropDownList ddl = gv.Rows[e.RowIndex].FindControl("ddl_RoleName") as DropDownList;
9
10 //下面确定需要插入或者编辑的字段
11 string userId = IsInsert ?
12 (gv.Rows[0].FindControl("txt_UserId") as TextBox).Text.Trim() :
13 gv.DataKeys[0]["UserId"].ToString();
14 string name = (gv.Rows[e.RowIndex].FindControl("txt_Name") as TextBox).Text.Trim(); //错误1 cells[0-1]
15 string gender = rbl.SelectedItem.Value;
16 string password = "123"; //插入新的用户时,默认密码为123
17 int roleId = Convert.ToInt32(ddl.SelectedItem.Value);
18
19 //以下进行插入或者编辑操作,因为原本是三层架构的Demo,所以这里就不写一坨了,本文重点也不在这里。
20 if (IsInsert)
21 {
22 UserEntity user = new UserInfo(userId, name, gender, password, roleId);
23 user.InsertUser(user);
24 }
25 else
26 {
27 UserEntity user = new UserEntity(userId);
28 user.Name = name;
29 user.Gender = gender;
30 user.RoleId = roleId;
31 user.UpdateUser(user);
32 }
33
34 gv.EditIndex = -1;
35 gv_DataBind(); //调用自定义的事件绑定函数
36 }
5、下面给出编辑和插入时的截图:
至此,最终要的两个部分都给出了。也就表达了本文的意思了:用这种方法实现GridView的插入功能。