考慮到很多數據源是不確定的,所以這時無法在前台設置gridview的表頭,需要在后台動態指定並綁定數據。
前台代碼如下:
<%@ Page Title="主頁" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <div> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> </asp:Content>
.cs頁面代碼如下:
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { BindData(); } /// <summary> /// 綁定gridview /// </summary> public void BindData() { string sqlcc = "SELECT * from Users";//order by gwbg.id desc DataTable dt = new DataTable(); dt = DBHelp.ExecuteQueryWithoutParameter(sqlcc, CommandType.Text); GridView1.AutoGenerateColumns = false;//設置自動產生列為false GridView1.RowEditing += new GridViewEditEventHandler(GridView1_RowEditing); //添加編輯事件 GridView1.RowDeleting += new GridViewDeleteEventHandler(GridView1_RowDeleting);//添加刪除事件 GridView1.RowCancelingEdit += new GridViewCancelEditEventHandler(GridView1_RowCancelingEdit);//添加刪除事件 GridViewBind(GridView1, dt, "Id"); } /// <summary> /// 綁定生成GridView /// </summary> /// <param name="gdv">要綁定的GridView</param> /// <param name="dtblDataSource">GridView的數據源</param> /// <param name="strDataKey">GridView的DataKeyNames</param> public static void GridViewBind(GridView gdv, DataTable dtblDataSource, string strDataKey) { gdv.Columns.Clear(); gdv.AutoGenerateColumns = false; gdv.DataSource = dtblDataSource; gdv.DataKeyNames = new string[]{ strDataKey }; for (int i = 0; i < dtblDataSource.Columns.Count; i++) //綁定普通數據列 { BoundField bfColumn = new BoundField(); bfColumn.DataField = dtblDataSource.Columns[i].ColumnName; bfColumn.HeaderText = dtblDataSource.Columns[i].Caption; gdv.Columns.Add(bfColumn); } //添加編輯列 CommandField cf = new CommandField();//命令字段 cf.ButtonType = ButtonType.Link;//超鏈接樣式的按鈕 cf.ShowEditButton = true;//顯示編輯按鈕 cf.CausesValidation = false;//引發數據驗證為false cf.HeaderText = "編輯"; cf.ItemStyle.HorizontalAlign = HorizontalAlign.Center; gdv.Columns.Add(cf);//添加編輯按鈕到gridview //添加刪除列 CommandField cf2 = new CommandField(); cf2.ButtonType = ButtonType.Link; cf2.ShowDeleteButton = true;//顯示刪除按鈕 cf2.CausesValidation = false; cf2.HeaderText = "刪除"; cf2.ItemStyle.HorizontalAlign = HorizontalAlign.Center; gdv.Columns.Add(cf2); //添加包復選框的模板列 TemplateField tf = new TemplateField(); tf.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow); //tf.HeaderText = "選擇"; tf.HeaderTemplate = new MyTemplate("模版列-選擇框", DataControlRowType.Header); tf.ItemStyle.HorizontalAlign = HorizontalAlign.Center; gdv.Columns.Add(tf); gdv.DataBind();//綁定 } //刪除gridview的行 void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { int i = e.RowIndex; MessageBox.Show(this, "刪除ID為:"+GridView1.Rows[i].Cells [0].Text.ToString () ); } //編輯行 public void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { int i = e.NewEditIndex; string id = GridView1.Rows[i].Cells[0].Text.ToString(); MessageBox.Show(this, "刪除ID為:" + id); } //取消 protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { GridView1.EditIndex = -1; BindData(); } }
其中,添加模版的MyTemplate類代碼為:
public class MyTemplate : ITemplate { private string strColumnName; private DataControlRowType dcrtColumnType; public MyTemplate() { // // TODO: 在此處添加構造函數邏輯 // } /// <summary> /// 動態添加模版列 /// </summary> /// <param name="strColumnName">列名</param> /// <param name="dcrtColumnType">列的類型</param> public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType) { this.strColumnName = strColumnName; this.dcrtColumnType = dcrtColumnType; } public void InstantiateIn(Control ctlContainer) { switch (dcrtColumnType) { case DataControlRowType.Header: //列標題 //如果頭部使用標題則使用以下代碼 Literal ltr = new Literal(); ltr.Text = strColumnName; ctlContainer.Controls.Add(ltr); break; case DataControlRowType.DataRow: //模版列內容——加載CheckBox CheckBox cb = new CheckBox(); cb.ID = "CheckBox1"; cb.Checked = false; ctlContainer.Controls.Add(cb); break; } } }
在MyTemplate類中,這里是直接寫了添加CheckBox,其實我們可以在MyTemplate的構造函數里添加一個參數,表示傳進來的要在模版里面添加的控件的類型。這樣就可以根據
控件類型來自動生成控件了,而不要在類里面去手動寫需要生成的控件。
其中效果圖如下: