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:                 else
  50:                     ViewState["Sort"] = "Desc";
  51:             }
  52:             else
  53:             {
  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:                 else
  47:                 {
  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。

 

下载 Demo

posted @ 2011-08-18 23:37  船长&CAP  阅读(592)  评论(0编辑  收藏  举报
免费流量统计软件