ASP.NET GridView
本文内容
- 分页并排序
- CommandField
- HyperLinkField和ButtonField
- 模板列TemplateField
- 用途多多的 OnRowDataBound 事件
分页并排序
<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Web.UI" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script runat="server">1:2: protected void Page_Load(object sender, EventArgs e)3: {4: if (!IsPostBack)5: {6: ViewState["Orderby"] = "c1";7: ViewState["Sort"] = "ASC";8: this.Bind();9: }10: }11: private void Bind()12: {13: DataTable dt = this.CreateDataSource();14: DataView dv = dt.DefaultView;15: string Orderby = (string)ViewState["Orderby"] + " " + (string)ViewState["Sort"];16: dv.Sort = Orderby;17: GridView1.DataSource = dv;18: GridView1.DataKeyNames = new string[] { "c1" };19: GridView1.DataBind();20: }21: private DataTable CreateDataSource()22: {23: DataTable dt = new DataTable();24: dt.Columns.Add("c1", typeof(int));25: dt.Columns.Add("c2", typeof(string));26: dt.Columns.Add("c3", typeof(string));27: for (int i = 0; i < 100; i++)28: {29: DataRow dr = dt.NewRow();30: dr[0] = i;31: dr[1] = i;32: dr[2] = i;33: dt.Rows.Add(dr);34: }35: return dt;36: }37: protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)38: {39: GridView1.PageIndex = e.NewPageIndex;40: this.Bind();41: }42: protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)43: {44: string Orderby = e.SortExpression;45: if (ViewState["Orderby"].ToString() == Orderby)46: {47: if (ViewState["Sort"].ToString() == "Desc")48: ViewState["Sort"] = "ASC";49: else50: ViewState["Sort"] = "Desc";51: }52: else53: {54: ViewState["Orderby"] = e.SortExpression;55: }56: this.Bind();57: }58:</script>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" OnSorting="GridView1_Sorting" AllowSorting="True"
OnPageIndexChanging="GridView1_PageIndexChanging" AutoGenerateColumns="False"
AllowPaging="True">
<Columns>
<asp:BoundField DataField="c1" HeaderText="列1" SortExpression="c1" />
<asp:BoundField DataField="c2" HeaderText="列2" SortExpression="c2" />
<asp:BoundField DataField="c3" HeaderText="列3" SortExpression="c3" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
说明
- 针对分页部分
(1) 在 Page_Load 事件里设置 GridView 的“分页(AllowPaging)”、“每页记录条数(PageSize)”、“自动产生列(AutoGenerateColumns)”属性,这些属性也可以直接在控件里设置;
(2) 然后从数据库中获得数据集,并设置主键,再绑定到控件;
(3) 主键可以不设置,设置主键主要是为了便于在 GridView 控件中利用主键直接定位到某条记录,如:GridView1.DataKeys[e.RowIndex].Value,对该记录进行编辑、修改和删除操作;
(4) 如果不设置主键,也可以从 GridView 单元格里直接获取数据 GridView1.Rows[i].Cells[i].toString(),如果 GridView 控件处于编辑状态,要将其转换成相应的控件类型;
(5) 默认情况下,处于编辑状态的 GridView 控件,每个单元格是 TextBox 控件。如果使用模板列,自定义每个单元格的控件,如单选框或复选框,则要进行相应的转换;
(6) 一般,若想获得某条记录某列的值,是通过模板列中控件的ID在 GridView 控件里进行查找,例如:
(CheckBox)GridView1.Rows[i].FindControl("CheckBox1"); 含义:在 GridView 控件的第 i 行上,查找“ID”为“CheckBox1”的控件,并转换成 CheckBox 类型,这样就可以对这个单元格进行形如 CheckBox 控件的操作。
另外,无论何时你都可以遍历 GridView 的标题和网格内容。如下代码遍历 GridView 的标题:
for (int i = 0; i <= GridView1.HeaderRow.Cells.Count - 1; i++)
{ string str = GridView1.HeaderRow.Cells[i].Text; // ...... }
如下代码遍历 GridView 的内容:
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{ for (int j = 1; j <= GridView1.HeaderRow.Cells.Count - 1; j++)
{ string str = GridView1.Rows[i].Cells[j].Text; // ...... }
}
(7) 对于数据分页,一般不采用ASP.NET自带的,比较难看,而是采用专门的分页控件。分页控件有各种式样,其实原理都一样,将SQL语句、当前页数和总页数保存到页面变量中,根据需要在页面上Render画出来。
- 针对排序部分
(1) 设置GridView控件的AutoGenerateColumns(是否自动产生列)和AllowSorting(是否允许排序)属性;
(2) 在GridView控件里用BoundField自定义绑定列(字段),并设置其属性DataField、HeaderText和SortExpression设置绑定列名、显示列名和排序字段;
(3) 在Page_Load事件里设置默认的排序字段和排序方式,绑定到控件;
(4) 实现排序功能必须使用数据集的视图。在自定义绑定函数Bind()中,使用DataTable数据集的视图DefaultView绑定控件,从页面的视图变量Sort和Order中获得当前的排序字段和排序方式,赋值给数据集视图DefaultView的成员变量Sort,绑定到控件;
(5) 最后,在GridView1_Sorting事件中,用e.SortExpression获得当前的排序字段,并根据实际改变排序字段和排序方式,绑定到控件。
CommandField
<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Web.UI" %><!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 id="Head1" runat="server">
<title></title>
<script runat="server">1:2: protected void Page_Load(object sender, EventArgs e)3: {4: if (!IsPostBack)5: {6: this.Bind();7: }8: }9: private void Bind()10: {11: DataTable dt = this.CreateDataSource();12: GridView1.DataSource = dt;13: GridView1.DataKeyNames = new string[] { "c1" };14: GridView1.DataBind();15: }16: private DataTable CreateDataSource()17: {18: DataTable dt = new DataTable();19: dt.Columns.Add("c1", typeof(int));20: dt.Columns.Add("c2", typeof(string));21: dt.Columns.Add("c3", typeof(string));22: for (int i = 1; i <= 100; i++)23: {24: DataRow dr = dt.NewRow();25: dr[0] = i;26: dr[1] = i * 10;27: dr[2] = i * 100;28: dt.Rows.Add(dr);29: }30: return dt;31: }32: protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)33: {34: GridView1.PageIndex = e.NewPageIndex;35: this.Bind();36: }37: protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)38: {39: GridView1.EditIndex = e.NewEditIndex;40: Bind();41: }42: protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)43: {44: string sqlStr = "DELETE FROM RECORDNOWRAP WHERE c1=:var";45: string keyValue = GridView1.DataKeys[e.RowIndex].Value.ToString();46: sqlStr = sqlStr.Replace(":var", keyValue);47: // 执行数据删除48: this.TextBox1.Text = "已删除主键为 " +keyValue + " 的记录.";49: Bind();50: }51: protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)52: {53: GridView1.EditIndex = -1;54: Bind();55: }56: protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)57: {58: string sqlStr = "UPDATE RECORDNOWRAP SETc1=:var1,c2=':var2',c3=':var3' WHERE c1=:vKeyValue";59: string keyValue = GridView1.DataKeys[e.RowIndex].Value.ToString();60: string var1 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim();61: string var2 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[4].Controls[0])).Text.ToString().Trim();62: string var3 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[5].Controls[0])).Text.ToString().Trim();63: sqlStr = sqlStr.Replace(":var1", var1).Replace(":var2",var2).Replace(":var3", var3).Replace(":vKeyValue",keyValue);64: // 执行数据库更新65: this.TextBox1.Text = "已更新主键为 " +keyValue + " 的记录.";66:67: GridView1.EditIndex = -1;68: Bind();69: }70: protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)71: {72: int index = GridView1.SelectedIndex;73: TextBox1.Text =GridView1.DataKeys[index].Value.ToString();74: }75:</script>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="True"
OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDeleting="GridView1_RowDeleting"
OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
OnPageIndexChanging="GridView1_PageIndexChanging">
<Columns>
<asp:CommandField HeaderText="选择" ShowSelectButton="True" SelectText="选择" />
<asp:CommandField HeaderText="编辑" ShowEditButton="True" SelectText="select" CancelText="取消"
EditText="编辑" UpdateText="更新" />
<asp:CommandField HeaderText="删除" ShowDeleteButton="True" SelectText="select" DeleteText="删除" />
<asp:BoundField DataField="c1" HeaderText="列1" />
<asp:BoundField DataField="c2" HeaderText="列2" />
<asp:BoundField DataField="c3" HeaderText="列3" />
</Columns>
</asp:GridView>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</form>
</body>
</html>
说明
1,在 Bind() 函数里,设置主键,可以为多个。这样才能在以后使用GridView1.DataKeys[...].Value。
HyperLinkField和ButtonField
<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Web.UI" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script runat="server">1:2: protected void Page_Load(object sender, EventArgs e)3: {4: if (!IsPostBack)5: {6: this.Bind();7: }8: }9: private void Bind()10: {11: DataTable dt = this.CreateDataSource();12: GridView1.DataSource = dt;13: GridView1.DataKeyNames = new string[] { "c1" };14: GridView1.DataBind();15: }16: private DataTable CreateDataSource()17: {18: DataTable dt = new DataTable();19: dt.Columns.Add("c1", typeof(int));20: dt.Columns.Add("c2", typeof(string));21: dt.Columns.Add("c3", typeof(string));22: for (int i = 1; i <= 100; i++)23: {24: DataRow dr = dt.NewRow();25: dr[0] = i;26: dr[1] = i * 10;27: dr[2] = i * 100;28: dt.Rows.Add(dr);29: }30: return dt;31: }32: protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)33: {34: GridView1.PageIndex = e.NewPageIndex;35: this.Bind();36: }37: protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)38: {39: if (e.CommandName == "select")40: {41: int i = Convert.ToInt32(e.CommandArgument);42: TextBox1.Text = GridView1.Rows[i].Cells[2].Text.ToString();43: }44: }45:</script>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="True"
OnRowCommand="GridView1_RowCommand" OnPageIndexChanging="GridView1_PageIndexChanging">
<Columns>
<asp:ButtonField CommandName="select" HeaderText="一般按钮" Text="选择" ButtonType="Button"
DataTextField="c1" DataTextFormatString="选择:{0}"></asp:ButtonField>
<asp:HyperLinkField HeaderText="链接按钮" Text="选择" DataTextField="c1" DataTextFormatString="选择:{0}"
DataNavigateUrlFields="c1" DataNavigateUrlFormatString="~/page.aspx?id={0}">
</asp:HyperLinkField>
<asp:BoundField DataField="c1" HeaderText="列1" />
<asp:BoundField DataField="c2" HeaderText="列2" />
<asp:BoundField DataField="c3" HeaderText="列3" />
</Columns>
</asp:GridView>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</form>
</body>
</html>
说明
- 针对ButtonField
(1) 创建两个事件OnPageIndexChanging 和 OnRowCommand;
(2) GridView控件的第一列是Button自定义控件,CommandName="select"命令名为选择,ButtonType="Button"按钮类型为按钮,此外还有 LinkButton 和 ImageButton 类型,DataTextField="empno" 和DataTextFormatString="选择:{0}" 设置绑定的字段和显示格式;
(3) Convert.ToInt32(e.CommandArgument) 获得行号。
- 针对HyperLinkField
(1) 设置 DataNavigateUrlFields="c1"和DataNavigateUrlFormatString="~/page.aspx?id={0}",将编号作为参数,传给page.aspx页面。
模板列TemplateField
<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Web.UI" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script runat="server">1:2: protected void Page_Load(object sender, EventArgs e)3: {4: if (!IsPostBack)5: {6: this.Bind();7: }8: }9: private void Bind()10: {11: DataTable dt = this.CreateDataSource();12: GridView1.DataSource = dt;13: GridView1.DataKeyNames = new string[] { "id" };14: GridView1.DataBind();15: }16: private DataTable CreateDataSource()17: {18: DataTable dt = new DataTable("info");19: dt.Columns.Add("id", typeof(int));20: dt.Columns.Add("name", typeof(string));21: dt.Columns.Add("sex", typeof(int));22: dt.Columns.Add("edu", typeof(int));23: for (int i = 1; i <= 100; i++)24: {25: DataRow dr = dt.NewRow();26: dr[0] = 1000 + i;27: dr[1] = "名字" + i;28: dr[2] = (i % 2).ToString();29: dr[3] = ((i % 3) + 1).ToString();30: dt.Rows.Add(dr);31: }32: return dt;33: }34: protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)35: {36: GridView1.EditIndex = e.NewEditIndex;37: Bind();38: }39: protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)40: {41: GridView1.EditIndex = -1;42: Bind();43: }44: protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)45: {46: string sqlStr = "DELETE FROM info WHERE id=':vId'";47: string id = GridView1.DataKeys[e.RowIndex].Values[0].ToString();48: sqlStr = sqlStr.Replace(":vId", id);49: // 执行数据库删除50: this.TextBox1.Text = "已执行删除.";51: Bind();52: }53: protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)54: {55: string sqlStr = "update info set sex=':vSex',name=':vName',edu=':vEdu' where id=:vId'";56: string id = GridView1.DataKeys[e.RowIndex].Values[0].ToString();57: string name = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("txt_name")).Text.ToString().Trim();58: string sex = ((RadioButtonList)GridView1.Rows[e.RowIndex].FindControl("rbl_sex")).SelectedValue.Trim();59: string edu = ((DropDownList)GridView1.Rows[e.RowIndex].FindControl("ddl_edu")).SelectedItem.Text.ToString();60: sqlStr = sqlStr.Replace(":vSex", sex).Replace(":vName", name).Replace(":vEdu", edu).Replace(":vId", id);61: // 执行数据库更新62: GridView1.EditIndex = -1;63: Bind();64: }65: protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)66: {67: GridView1.PageIndex = e.NewPageIndex;68: this.Bind();69: }70: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)71: {72: if (e.Row.RowType == DataControlRowType.DataRow)73: {74: Label lbl = ((Label)e.Row.FindControl("lbl_edu"));75: if (lbl != null)76: {77: switch (lbl.Text)78: {79: case "1":80: lbl.Text = "学士";81: break;82: case "2":83: lbl.Text = "硕士";84: break;85: case "3":86: lbl.Text = "博士";87: break;88: }89: }90: lbl = ((Label)e.Row.FindControl("lbl_sex"));91: if (lbl != null)92: {93: switch (lbl.Text)94: {95: case "1":96: lbl.Text = "男";97: break;98: case "0":99: lbl.Text = "女";100: break;101: }102: }103: DropDownList ddl = (DropDownList)e.Row.FindControl("ddl_edu");104: if (ddl != null)105: {106: ddl.Items.Clear();107: ddl.Items.Add(new ListItem("学士", "1"));108: ddl.Items.Add(new ListItem("硕士", "2"));109: ddl.Items.Add(new ListItem("博士", "3"));110: }111: RadioButtonList rbl = (RadioButtonList)e.Row.FindControl("rbl_sex");112: if (rbl != null)113: {114: rbl.Items.Clear();115: rbl.Items.Add(new ListItem("男", "1"));116: rbl.Items.Add(new ListItem("女", "0"));117: string selectedValue = rbl.DataValueField.ToString();118: switch (selectedValue)119: {120: case "1":121: rbl.Items[0].Selected = true;122: break;123: case "0":124: rbl.Items[1].Selected = true;125: break;126: }127: }128: }129: }130:</script>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="true"
OnPageIndexChanging="GridView1_PageIndexChanging" OnRowDataBound="GridView1_RowDataBound"
OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDeleting="GridView1_RowDeleting"
OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:TemplateField HeaderText="编号">
<ItemTemplate>
<%1: # this.GridView1.PageIndex * this.GridView1.PageSize + this.GridView1.Rows.Count + 1%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="学号">
<ItemTemplate>
<asp:Label ID="lbl_id" runat="server" Text='<%# Bind("id")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txt_id" runat="server" Text='<%# Bind("id")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="名字">
<ItemTemplate>
<asp:Label ID="lbl_name" runat="server" Text='<%# Bind("name")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txt_name" runat="server" Text='<%# Bind("name")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="性别">
<ItemTemplate>
<asp:Label ID="lbl_sex" runat="server" Text='<%# Bind("sex")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:RadioButtonList ID="rbl_sex" runat="server" DataValueField='<%# Bind("sex")%>'>
</asp:RadioButtonList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="学历">
<ItemTemplate>
<asp:Label ID="lbl_edu" runat="server" Text='<%# Bind("edu")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddl_edu" runat="server" DataValueField='<%# Bind("edu")%>'>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="操作" ShowHeader="False">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit"
Text="编辑" OnClientClick="return confirm('确认要编辑吗?');">
</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" CausesValidation="False" CommandName="Delete"
Text="删除" OnClientClick="return confirm('确认要删除吗?');">
</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Select"
Text="选择"></asp:LinkButton>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update"
Text="更新"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel"
Text="取消"></asp:LinkButton>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</form>
</body>
</html>
用途多多的 OnRowDataBound 事件
<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Web.UI" %><!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 id="Head1" runat="server">
<title></title>
<script runat="server">1:2: protected void Page_Load(object sender, EventArgs e)3: {4: if (!IsPostBack)5: {6: this.Bind();7: }8: }9: private void Bind()10: {11: DataTable dt = this.CreateDataSource();12: GridView1.DataSource = dt;13: GridView1.DataKeyNames = new string[] { "c1" };14: GridView1.DataBind();15: }16: private DataTable CreateDataSource()17: {18: DataTable dt = new DataTable();19: dt.Columns.Add("c1", typeof(int));20: dt.Columns.Add("c2", typeof(string));21: dt.Columns.Add("c3", typeof(string));22: for (int i = 0; i < 100; i++)23: {24: DataRow dr = dt.NewRow();25: dr[0] = i;26: dr[1] = i;27: dr[2] = i;28: dt.Rows.Add(dr);29: }30: return dt;31: }32: protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)33: {34: GridView1.PageIndex = e.NewPageIndex;35: this.Bind();36: }37: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)38: {39: if (e.Row.RowIndex != -1)40: {41: if (e.Row.RowIndex % 2 == 0)42: {43: e.Row.BackColor = System.Drawing.Color.Red;44: e.Row.Cells[0].BackColor = System.Drawing.Color.Chocolate;45: }46: else47: {48: e.Row.BackColor = System.Drawing.Color.Blue;49: e.Row.Cells[0].BackColor = System.Drawing.Color.Coral;50: }51: }52: }53:</script>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" OnPageIndexChanging="GridView1_PageIndexChanging"
AutoGenerateColumns="False" AllowPaging="True" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="c1" HeaderText="列1" SortExpression="c1" />
<asp:BoundField DataField="c2" HeaderText="列2" SortExpression="c2" />
<asp:BoundField DataField="c3" HeaderText="列3" SortExpression="c3" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
说明
(1) OnRowDataBound 事件是数据绑定后,显示之前触发,此事件通常用于改变数据库中显示在GridView中的内容。在本例中,改变奇数行和偶数行的背景色,顺便改变奇数行和偶数行第一列的背景色;
(2) 根据这个事件的描述,我们可以想到,这个事件有很多用处。
比如,突出显示某列(某行)。假设有个员工工资的数据,想突出显示员工工资大于1000的员工;
比如,截取长字符串。假设数据中某行某列的数据很长,造成显示问题,那么可以截取该数据一部分来显示,如字符长度大于某个值之后的所有字符用省略号代替;
比如,改变选中行的风格。也就是说,当选中某行数据时(鼠标停留时),会高亮显示该数据行。代码如下:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{ if (e.Row.RowType == DataControlRowType.DataRow) {e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style.backgroundColor='#FF0033'");
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");
}
}
注意:在 OnRowDataBound 事件中,添加客户端事件 onmouseover 和 onmouseout ,改变行背景色。
比如,超长记录不换行。假设数据的字段很多,并且某个字段的数据很长,超过屏幕宽度,但是还想全部显示,又不想截取。
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{ if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Cells[0].Wrap = false;e.Row.Cells[0].Style.Add("word-break", "keep-all");
}
}
注意:e.Row.Cells[0]中的索引表示那个数据很长的字段。通过上面两段代码可以看到,在服务器端,可以向控件添加客户端功能,比如CSS,事件等,慢慢挖掘吧。
另外,其实,像这样,在后台改变网格的CSS,意义不是很大,因为这是UI人员的工作,而不是开发人员的,UI们能把效果做得更好。就像我刚毕业时做的一个项目,每张表的数据字段都很多,几乎超过100个,个别字段还有大段的文字描述。当时我想,让网格在页面的一个DIV区域内显示。如果超过屏幕区域,就自动出滚动条。如果个别字段数据很长,那也不截取,不换行显示。让网格始终在一个区域内显示,无论字段多少,数据多长。头也催,要做成这种效果。搞了半天也没弄出来。我当时就不爽了,开发量那么大,就那么几个鸟人,你还让我给你做界面……后来公司新来个做UI,我说了下需求,人家很快搞定,全是CSS。

浙公网安备 33010602011771号