后台動態生成GridView列和模版


考慮到很多數據源是不確定的,所以這時無法在前台設置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的構造函數里添加一個參數,表示傳進來的要在模版里面添加的控件的類型。這樣就可以根據

控件類型來自動生成控件了,而不要在類里面去手動寫需要生成的控件。


其中效果圖如下:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM