<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        DataGrid 動態添加模板列 實現代碼

        來源:懂視網 責編:小采 時間:2020-11-27 22:44:31
        文檔

        DataGrid 動態添加模板列 實現代碼

        DataGrid 動態添加模板列 實現代碼:使用模版的另一個優勢,就是它們能動態的添加到你的控件里面去. 這樣的話, 你可以事先設計好模版, 然后通過簡單的幾行代碼就添加到你的控件中. 下面這篇文章就要告訴你如何如何一步步的添加一個動態的ItemTemplate和EditItemTemplate到DataGrid
        推薦度:
        導讀DataGrid 動態添加模板列 實現代碼:使用模版的另一個優勢,就是它們能動態的添加到你的控件里面去. 這樣的話, 你可以事先設計好模版, 然后通過簡單的幾行代碼就添加到你的控件中. 下面這篇文章就要告訴你如何如何一步步的添加一個動態的ItemTemplate和EditItemTemplate到DataGrid

        使用模版的另一個優勢,就是它們能動態的添加到你的控件里面去. 這樣的話, 你可以事先設計好模版, 然后通過簡單的幾行代碼就添加到你的控件中.

        下面這篇文章就要告訴你如何如何一步步的添加一個動態的ItemTemplate和EditItemTemplate到DataGrid中. 另外, 還會告訴你怎么獲取和更新用戶對EditItemTemplate所做的改變. 例子將會是很簡單的. 然后, 我很快就會在TripleASP上面正式發布一個改進后的TableEditor版本. 這個版本將更好的說明如何使用動態模版.


        ITempalte的實現
        為了能動態的添加ItemTemplate和EditItemTemplate, 我們需要創建2個類來實現ITemplate的接口(Interface). 第一個類是GenericItem. 這個類的主要工作就是: 取數據源的列名, 創建一個文本控件(literal contral), 為這個文本控件賦值, 最后把這個文本控件加到父控件(在這里父控件就是DataGrid了).

        到目前為止還是很順利. 在繼續下面的討論之前, 我們來看看代碼和完成的步驟.
        using System;
        using System.Web;
        using System.Data; using System.Web.UI;
        using System.Web.UI.WebControls;

        namespace TripleASP.ItemTemplates
        {
        /// <summary>
        /// Summary description for GenericItem.
        /// </summary>
        public class GenericItem : ITemplate
        {
        private string column;
        //private bool validate;
        public GenericItem(string column)
        {
        this.column = column;
        }
        public void InstantiateIn(Control container)
        {
        Literal l = new Literal();
        l.DataBinding += new EventHandler(this.BindData);
        container.Controls.Add(l);
        }

        public void BindData(object sender, EventArgs e)
        {
        Literal l = (Literal) sender;
        DataGridItem container = (DataGridItem) l.NamingContainer;
        l.Text = ((DataRowView) container.DataItem)[column].ToString();

        }
        }
        }

        正如你看到的, GenericItem類實現了ITemplate的接口(interface). 因為我們是實現接口, 所以必須包括InstantiateIn這個方法. 這個方法是用來定義所有子控件和模版所屬的控件對象的. 在這個方法里面, 我們創建了一個新的Literal控件來保存DataGrid的單元值. 接著, 我們添加了DataBinding事件處理函數. 這個事件處理函數實際上就是在DataGrid綁定數據的時候, 把單元值放到Literal控件的Text屬性中. 最后, 把這個Literal控件加入到控件的容器集合中. 很簡單吧?

        動態EditItemTemplate
        動態EditItemTemplate類ValidateEditItem跟GenericItem很類似, 但是有3個地方不同.
        第一個不同的地方是, 我們添加的是Textbox控件而不是Literal控件. 這樣的話, 在編輯模式下, 用戶可以做任何修改.
        第二個不同的地方, 你會發現我們會顯式地命名控件. 這會使我們能夠獲取更新事件中的任何數據變化.
        最后一個不同, 你會看到一個跟Textbox相聯系的RequiredFieldValidator控件. 這是可選的. 但是, 這的確讓你知道有些事是可以這樣做的.
        下面就是ValidateEditItem的代碼:
        using System;
        using System.Data;
        using System.Web.UI;
        using System.Web.UI.WebControls;
        using System.Web;

        namespace TripleASP.ItemTemplates
        {
        /// <summary>
        /// Summary description for ValidateEditItem.
        /// </summary>
        public class ValidateEditItem : ITemplate
        {
        private string column;
        public ValidateEditItem(string column)
        {
        this.column = column;
        }

        public void InstantiateIn(Control container)
        {
        TextBox tb = new TextBox();
        tb.DataBinding += new EventHandler(this.BindData);
        container.Controls.Add(tb);
        tb.ID = column;

        RequiredFieldValidator rfv = new RequiredFieldValidator();
        rfv.Text = "Please Answer";
        rfv.ControlToValidate = tb.ID;
        rfv.Display = ValidatorDisplay.Dynamic;
        rfv.ID = "validate" + tb.ID;
        container.Controls.Add(rfv);

        }

        public void BindData(object sender, EventArgs e)
        {
        TextBox tb = (TextBox) sender;
        DataGridItem container = (DataGridItem)tb.NamingContainer;
        tb.Text = ((DataRowView) container.DataItem)[column].ToString();
        }
        }
        }

        動態模版的實現
        現在我們已經有兩個實現了ITempalte接口的類了. 一切準備好了! 我們現在要做的就是把它們加入到我們的datagrid里面.

        我們把BindData和DynamicColumns兩個方法放在一起. BindData主要是創建SQL查詢語句, 往datagrid添加列(動態列), 然后把數據表綁定到datagrid.

        void BindData()
        {
        string sql = "Select * from publishers Where State Is not null";
        DataGrid1.Columns.Add(DynamicColumns("pub_id",false));
        DataGrid1.Columns.Add(DynamicColumns("pub_name",true));
        DataGrid1.Columns.Add(DynamicColumns("city",true));
        DataGrid1.Columns.Add(DynamicColumns("state",true));
        DataGrid1.Columns.Add(DynamicColumns("country",true));
        DataGrid1.DataKeyField = "pub_id";
        DataGrid1.DataSource = GetDataTable(sql);
        DataGrid1.DataBind();
        }

        DynamicColumns有兩個參數: column(字符類型)和isEditable(布爾類型). column變量當然就是我們要加入TemplateColumn的列名. isEditable變量是用作測試的, 如果我們希望這個列是允許編輯的話.
        protected TemplateColumn DynamicColumns(string column, bool isEditable)
        {
        TemplateColumn genericcolumn = new TemplateColumn();
        genericcolumn.HeaderText = column;
        genericcolumn.ItemTemplate = new GenericItem(column);
        if(isEditable)
        {
        genericcolumn.EditItemTemplate = new ValidateEditItem(column);
        }
        return genericcolumn;
        }

        正如你所看到的, 首先我們實例化一個TemplateColumn(genericcolumn), 根據我們要添加的列的名字設置HeaderText屬性(當然,你可以設置為任何東西都可以). 接著, 我們通過添加新的GenericItem的參考(reference), 把ItemTemplate添加到genericcolumn, 并把名稱傳入. 最后, 我們必須檢查isEditable, 以便看看我們需不需要允許編輯這個列. 如果為真, 我們要往ValidateEditItem添加新的參考, 而且把列名也傳過去.


        DataGrid事件
        我們的編輯和取消事件是很標準的. 你有可能已經看過它們100遍了. 在我們的編輯事件里面, 我們簡單地取出被選中的行的編號, 然后重新綁定數據.

        protected void Edit_Click(Object sender, DataGridCommandEventArgs e)
        {
        DataGrid1.EditItemIndex = e.Item.ItemIndex;
        BindData();
        }
        我們的取消事件是把當前所選行號設為-1. 這樣就等于告訴datagrid, 不在是編輯模式了. 然后, 我們重新綁定數據.
        protected void Cancel_Click(Object sender, DataGridCommandEventArgs e)
        {
        DataGrid1.EditItemIndex = -1;
        BindData();
        }
        更新事件會跟你以前看到的有一點點不同. 然而, 它卻會讓你想起你在ASP的日子.
        protected void Update_Click(Object sender, DataGridCommandEventArgs e)
        {
        //Gets the UniqueID that is attached to the front of each textbox
        //dyamically added to our datagrid's EditItemTempate
        string uid = e.Item.UniqueID + ":";

        string pub_id = (string)DataGrid1.DataKeys[e.Item.ItemIndex];
        string pub_name = (Request.Form[uid + "pub_name"].ToString());
        string city = (Request.Form[uid + "city"].ToString());
        string state = (Request.Form[uid + "state"].ToString());
        string country = (Request.Form[uid + "country"].ToString());

        //Simple method to update DB
        UpdateRecord(pub_id,pub_name,city,state,country);
        DataGrid1.EditItemIndex = -1;
        BindData();
        }

        這樣的話, EditItemTemplate就硬編碼到頁面中去了. 你可能已經看過一些取表單提交數據的例子, 其中的方法, 或者是通過控件位置取值, 或者是控件名稱取值. 但是, 如果你是在運行時創建控件, 那么, 在PostBack的時候, ASP.NET是無法取得這些值的. 為此, 我們只能通過Request.Form的方法來得到這些值.

        在你開始在ValidateEditItem類里面仔細尋找被小心命名的textbox的時候, 你必須記住, ASP.NET已經為控件的名字沖突做了預防措施. 一般來說, 這包括增加每個datagrid父控件的名稱, datagrid本身的名稱, 和一個代表每個textbox的序號的字符串放在textbox的ID前面. 我們可以大量的使用這樣的方法. 但是這并不保證我們的代碼絕對的模塊化和可復用. 相反, 我們檢查DataGridCommandEventArgs.Item.UniqueID 并在尾部加上":". 有了這個UniqueID, 我們就可以安全地取得textbox里面的編輯數據, 并更新到數據庫.


        結論
        動態添加模版到你的模版控件會在開始的時候增加一點點的工作量. 但是, 一旦你建立了一系列的優秀的模版類, 你會發現, 實現ITemplate會非常的快速和容易. 它運行你建立強大的控件來滿足你數據操作的需要. 如果你需要更好的例子, 請看我即將發布在TripleASP的TableEditor控件.

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        DataGrid 動態添加模板列 實現代碼

        DataGrid 動態添加模板列 實現代碼:使用模版的另一個優勢,就是它們能動態的添加到你的控件里面去. 這樣的話, 你可以事先設計好模版, 然后通過簡單的幾行代碼就添加到你的控件中. 下面這篇文章就要告訴你如何如何一步步的添加一個動態的ItemTemplate和EditItemTemplate到DataGrid
        推薦度:
        標簽: 添加 動態 代碼
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 香港a毛片免费观看| 西西人体大胆免费视频| 国产免费一区二区三区不卡| 免费一级毛片清高播放| 国产精品亚洲天堂| 亚洲精品人成无码中文毛片| 国产成人精品免费视频大全| 国产福利电影一区二区三区,亚洲国模精品一区 | 一级毛片免费毛片一级毛片免费| 亚洲人成精品久久久久| 久久久久国产免费| 亚洲人成片在线观看| 免费看国产成年无码AV片| 亚洲爆乳大丰满无码专区| 又黄又爽的视频免费看| eeuss影院免费92242部| 亚洲AV永久青草无码精品| 7x7x7x免费在线观看| 亚洲精品456人成在线| 免费人成在线观看播放国产| 在线观看免费视频网站色| 亚洲Av无码精品色午夜| 免费A级毛片无码无遮挡内射| 亚洲精品无码不卡在线播放| 亚洲国产精品尤物yw在线| 久久国产精品国产自线拍免费| 78成人精品电影在线播放日韩精品电影一区亚洲| 久久午夜伦鲁片免费无码| 久久亚洲精品国产精品婷婷| 亚洲精品无码专区久久同性男| 最好免费观看高清在线| 亚洲成人福利在线| 亚洲成a人片在线播放| 久久免费精彩视频| 亚洲精品永久在线观看| 亚洲春色在线视频| 好吊妞788免费视频播放| 免费网站观看WWW在线观看| 亚洲久悠悠色悠在线播放| 亚洲日韩一页精品发布| 无码人妻久久一区二区三区免费丨 |