GridView控件用来在表中显示数据源的值。每列表示一个字段,而每行表示一条记录。
GridView控件支持下面的功能:
1.绑定至数据源控件,如SqlDataSource。
2. 内置排序功能。
3.内置更新与删除功能。
4.内置分页功能。
5.内置行选择功能。
6.以编程方式访问GridView对象模型以动态设置属性、处理事件等。
7.多个键字段。
8.用于超链接列的多个数据字段。
9.可以通过主题和样式进行自定义外观。
GridView控件中的每一列由一个DataControlField对象表示。
默认情况下,AutoGenerateColumns属性被设置为true,表示为数据源中的每个字段自动创建绑定字段,自动生成的绑定列字段不会添加到Columns集合中。
通过将AutoGenerateColumns属性设置为false,然后创建自定义的Columns集合,您可以手动定义列字段,而不是让GridView控件自动生成列字段。除了绑定列字段外,您还可以显示按钮列字段、复选框列字段、命令字段、超链接列字段、图像字段或基于您自己的自定义模板的列字段。
下表列出了可以使用的七种不同列字段类型。
Field字段类型 - | 说明 |
BoundField(数据绑定字段) | 将Data Source数据源中某个字段的数据以文本方式显示。这是GridView控件的默认列类型。 |
ButtonField(按钮字段) | 在数据绑定控件中显示命令按钮。根据控件的不同,它可让您可以创建一列自定义按钮控件(例如【添加】或【移除】按钮)的数据行或数据列,按下时会引发RowCommand事件。 |
CommandField(命令字段) | 显示用来执行含有预定义命令的Button按钮,包括了Select、Edit、Update、Delete命令按钮(DetailsView的CommandField才支持Insert命令) |
CheckBoxField(CheckBox字段) | 为GridView控件中的每一项显示一个CheckBox类型的复选框,通常用于布尔值True/False布尔值字段的显示。 |
HyperLinkField(超链接字段) | 将Data Source数据源字段数据显示成HyperLink超级链接,并可指定另外的NavigateUrl超链接 |
ImageField(图像字段) | 在数据绑定控件中显示图像字段 |
TemplateField(模板字段) | 根据指定的模板为GridView控件中的每一项显示用户定义的模板内容。此列字段类型允许您创建自定义的列字段。 |
自定义用户界面
您可以通过设置GridView控件的不同部分的样式属性自定义该控件的外观。下表列出了不同的样式属性。
样式属性 - | 说明 |
---|---|
AlternatingRowStyle | GridView控件中的交替数据行的样式设置。当设置了此属性时,数据行交替使用RowStyle设置和AlternatingRowStyle设置进行显示。 |
EditRowStyle | GridView控件中正在编辑的行的样式设置。 |
EmptyDataRowStyle | 当数据源不包含任何记录时,GridView控件中显示的空数据行的样式设置。 |
FooterStyle | GridView控件的脚注行的样式设置。 |
HeaderStyle | GridView控件的标题行的样式设置。 |
PagerStyle | GridView控件的页导航行的样式设置。 |
RowStyle | GridView控件中的数据行的样式设置。当还设置了AlternatingRowStyle属性时,数据行交替使用RowStyle设置和AlternatingRowStyle设置进行显示。 |
SelectedRowStyle | GridView控件中的选中行的样式设置。 |
也可以显示或隐藏控件的不同部分。下表列出控制显示或隐藏哪些部分的属性。
属性 | 说明 |
---|---|
ShowFooter | 显示或隐藏GridView控件的页脚节。 |
ShowHeader | 显示或隐藏GridView控件的页眉节。 |
事件
GridView控件提供多个您可以对其进行编程的事件。这使您可以在每次发生事件时都运行一个自定义例程。下表列出了GridView控件支持的事件。
事件 - | 说明 |
---|---|
PageIndexChanged | 在单击某一页导航按钮时,但在GridView控件处理分页操作之后发生。此事件通常用于以下情形:在用户定位到该控件中的另一页之后,您需要执行某项任务。 <pagersettings mode="Numeric" position="Bottom" pagebuttoncount="10"/> 从 10个按钮里面随便选择一个的情况 |
PageIndexChanging | 在单击某一页导航按钮时,但在GridView控件处理分页操作之前发生。此事件通常用于取消分页操作。 |
RowCancelingEdit | 在单击某一行的“取消”按钮时,但在GridView控件退出编辑模式之前发生。此事件通常用于停止取消操作。 |
RowCommand | 当单击GridView控件中的按钮时发生。此事件通常用于在控件中单击按钮时执行某项任务。 |
RowCreated | 当在GridView控件中创建新行时发生。此事件通常用于在创建行时修改行的内容。 |
RowDataBound | 在GridView控件中将数据行绑定到数据时发生。此事件通常用于在行绑定到数据时修改行的内容。 |
RowDeleted | 在单击某一行的“删除”按钮时,但在GridView控件从数据源中删除相应记录之后发生。此事件通常用于检查删除操作的结果。 |
RowDeleting | 在单击某一行的“删除”按钮时,但在GridView控件从数据源中删除相应记录之前发生。此事件通常用于取消删除操作。 |
RowEditing | 发生在单击某一行的“编辑”按钮以后,GridView控件进入编辑模式之前。此事件通常用于取消编辑操作。 |
RowUpdated | 发生在单击某一行的“更新”按钮,并且GridView控件对该行进行更新之后。此事件通常用于检查更新操作的结果。 |
RowUpdating | 发生在单击某一行的“更新”按钮以后,GridView控件对该行进行更新之前。此事件通常用于取消更新操作。 |
SelectedIndexChanged | 发生在单击某一行的“选择”按钮,GridView控件对相应的选择操作进行处理之后。此事件通常用于在该控件中选定某行之后执行某项任务。 |
SelectedIndexChanging | 发生在单击某一行的“选择”按钮以后,GridView控件对相应的选择操作进 行处理之前。此事件通常用于取消选择操作。 |
Sorted | 在单击用于列排序的超链接时,但在GridView控件对相应的排序操作进行处理之后发生。此事件通常用于在用户单击用于列排序的超链接之后执行某个任务。 |
Sorting | 在单击用于列排序的超链接时,但在GridView控件对相应的排序操作进行处理之前发生。此事件通常用于取消排序操作或执行自定义的排序例程。 |
代码说明部分:
一.GridView数据显示
原理:在页面加载时,将gridview绑定数据源,以进行显示
实现:
1. 使GridView绑定数据源,可以使DataTable,DataReader等。
///<summary>
/// gridviews实现数据源绑定
///</summary>
public void Bind()
{
con = new SqlConnection(strcon);
con.Open();
SqlDataAdapter da = new SqlDataAdapter(strsql, con);
DataSet ds = new DataSet();
da.Fill(ds);
GridView1.DataSource =ds;
GridView1.DataKeyNames = new string[] {"id" };//为了便于识别每行数据,加入键值进行分别,这里的键值时表中的主键id;
GridView1.DataBind();
con.Close();
}
2.
在页面加载时绑定数据源:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Bind();
}
}
3. 此时运行后显示的gridview标题是表的字段名。
这是gridview中AutoGenerateColumns="true"的作用,我们要自定义标题当然要AutoGenerateColumns="False"
然后就可以自己添加标题了:
编辑列—选择bindfild—添加—headtext中填写标题—datafield中填写表中的字段名如id,name等。
二. Gridview删除修改操作
原理:gridview属性中自带了GridView1_RowDeleting,GridView1_RowUpdating,GridView1_RowCancelingEdit等许多事件。当我们在页面中添加了这些事件按钮后就可以执行它。
实现:1.首先我们还是要添加删除,修改按钮,
编辑列-->选择ConmmandFieldà选择删除à添加
2.选择gridView属性—事件—>然后选择GridView1_RowDeleting双击会自动生成函数
3.然后再里面添加代码。注意获得所选行的键值一句
String id=Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);
E其中e.RowIndex表示你选择那一行的行数
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
con = new SqlConnection(strcon);
con.Open();
int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);//获取所选择行的键值
string strsql="delete from UserInfo where id='"+id+"'";
SqlCommand cmd = new SqlCommand(strsql, con);
cmd.ExecuteNonQuery();
Bind();
}
4. 最后同理。添加修改按钮,但是修改按钮中则包含的较多。其中有编辑,更新,取消三个响应事件。1.首先还是先添加CommandField—选择编辑,更新,取消—添加
2.在gridview事件中选择GridView1_RowEditing,GridView1_RowUpdating,GridView1_RowCancelingEdit分别双击,将自动产生消息响应函数。
3.添加代码如下:
///<summary>
///实现编辑
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
Bind();
}
///<summary>
///更新数据
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
con = new SqlConnection(strcon);
con.Open();
string uname = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
string upassword = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString();
string strsql = "update UserInfo set uname='"+uname+"', upassword='"+upassword+"'where id='"+Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value)+"'";
SqlCommand cmd = new SqlCommand(strsql, con);
cmd.ExecuteNonQuery();
GridView1.EditIndex = -1;
Bind();
}
///<summary>
///取消编辑
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
Bind();
}
三. GridView鼠标移动改变颜色以及删除时弹出提示框原理:在GridView事件GridView1_RowDataBound中添加javascrit事件。
实现:gridview属性事件中,双击GridView1_RowDataBound,自动生成函数后,添加以下代码:
///<summary>
///当鼠标移动时改变颜色,删除时弹出确认对话框
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)//判断是数据绑定行
{
if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
{
((LinkButton)(e.Row.Cells[4].Controls[0])).Attributes.Add("onclick", "javascript:return confirm('你确认要删除:\"" + e.Row.Cells[1].Text + "\"吗?')");
}
}
//鼠标移动后添加背景颜色
int i;
for (i = -1; i < GridView1.Rows.Count; i++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onmouseover","c=this.style.backgroundColor;this.style.backgroundColor='#00A9FF'");
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");
}
}
}
四. 添加模板控件
原理:当我们想在gridview中每一行添加一个CheckBox或则按钮时,这个时候我们就需要在添加列里编辑一个模板,然后再在模板里添加控件,而响应事件就是你控件的事件。
实现:第一步,我们当然是添加一个新列,比如我们添加一个checkBox来实现多项的选择,然后删除。编辑列,选择TemplateField—添加—HeadText命名为多选。
第二步,我们选择编辑模板,在显示里面选择column【】多选
然后再ItemTemplate框中拖入CheckBox控件CheckBox1,这里我们不需要再这里对该控件进行事件处理。
这时运行程序每行就会出现一个CheckBox.
第三步,再在gridView下面添加一个CheckBox控件checkBox2,旁边写上全选。目的是实现点击checkbox2时实现多选。然后双击CheckBox2,自动生成响应函数.
///<summary>
/// checkbox2即全选checked时将girdview控件中所有选择框点击
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
{
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");//搜寻每行ID为CheckBox1的CheckBox控件
if (CheckBox2.Checked == true)//如果CheckBox2点击了
{
cbox.Checked = true;
}
else
{
cbox.Checked = false;
}
}
}
最后,我们再在GridView控件下面添加一个删除按钮,将选择到得行进行删除。
///<summary>
///删除按钮响应事件
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void btn_delete_Click(object sender, EventArgs e)
{
con = new SqlConnection(strcon);
con.Open();
for(int i=0;i<=GridView1.Rows.Count-1;i++)
{
CheckBox cbox=(CheckBox )GridView1.Rows[i].FindControl("CheckBox1");
if(cbox.Checked==true)
{
string sqlstr = "delete from UserInfo where id='" + GridView1.DataKeys[i].Value + "'";
SqlCommand cmd=new SqlCommand(sqlstr,con);
cmd.ExecuteNonQuery();
}
}
con.Close();
Bind();
}
五,添加超链接,传递另一张页面id然后修改或添加数据
原理:添加超链接控件
实现:1.添加新列,选择HyperLinkField,点击添加。HeaderText随意命名;
<asp:HyperLinkField HeaderText="姓名" DataNavigateUrlFields="uname" DataTextField="uname"DataNavigateUrlFormatString="Default.aspx?passname ={0}" />
3. Default.aspx页面接受值。String name=Request.QueryString[“passname”]
实现:添加到处按钮,命名为btn_Excel,双击
protected void btn_Excel_Click(object sender, EventArgs e)
{
Export("application/ms-excel", "学生成绩报表.xls");
}
private void Export(string FileType, string FileName)
{
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF7;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
Response.ContentType = FileType;
this.EnableViewState = false;
StringWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
GridView1.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();
}
public override void VerifyRenderingInServerForm(Control control)
{
}
在GirdView
页面中头部
<%
@
Page
Language
="C#"
AutoEventWireup
="true"
CodeFile
="GridViewStudy.aspx.cs"
Inherits
="GridViewStudy"
EnableEventValidation
=
"false"
%>
添加
EnableEventValidation
=
"false"
wait...