GideView 动态列模板
2019獨角獸企業重金招聘Python工程師標準>>>
實際的應用的總是遇到 GrideView 需要動態生成一些數據列,也許是簡單的綁定列,更多時候會是特殊的模板列。我們不得不使用代碼生成自定義的模板列。 其實模板列的概念倒是很簡單,通過ASP的前臺代碼,我們很容易看出來模板列的結構,
TemplateField = HeaderTemplate + ItemTemplate (列模板 = 標題模板 + 子項模板) 模板只要是實現 ITemplate 接口,并根據需要實現 DataBind 的方法就可以了。
主要是自定義列數據綁定的問題,百度了很多,說法很多,有的說不建議使用自定義的模板列,因為從后臺無法獲取到值,還有把數據綁定的方法強制地指定到GrideView的DataRow_Bind的事件中,越看越迷茫,最后終于到 CodeProject 上找到答案,通過代碼也似乎領悟的GrideView單元格綁定的邏輯過程。 GrideView行綁定到達單元格中時,會調用我們指定的綁定方法為單元格中的控件賦值。默認的情況下當然是使用 DataField 中我們指定的的值進行綁定,但如果我們指定了綁定模板,它就會調用模版中 自定義控件 指定的 DataBing 方法。就是我們在控件事件中看到的這個:
在學校的還是照著課本打代碼的時候,我就很好奇這個事件是做什么用的、又如何使用,每一個控件都會有,但是直到倆年后的現在猜恍然大悟(大家不要噴飯哈)
想到這里數據綁定的問題也就解決了!說了一大通很羅嗦把,大家可以直接參考代碼
<!-- lang: c# -->using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data;namespace SSRISManager.BasePage {/// <summary>/// 超鏈接列的模板/// </summary>public class TemplateFieldColumn : TemplateField{private ItemTemplateLabel myHeaderTemplate = null;private ItemTemplateLinkBtn myFieldTemplate = null;public TemplateFieldColumn(string headerText, string fieldNmae,string formatString): base(){myFieldTemplate = new ItemTemplateLinkBtn(headerText, formatString, fieldNmae);myHeaderTemplate = new ItemTemplateLabel(headerText);this.ItemTemplate = myFieldTemplate;this.HeaderTemplate = myHeaderTemplate;}}#region Item Template for Link Button /// <summary> /// 為超鏈接創建模板元素 /// </summary> public class ItemTemplateLinkBtn : ITemplate {string strColumnText;string FieldGuid;string FormatString;/// <summary>/// 構造函數/// </summary>/// <param name="ColText">列名</param>/// <param name="navigateURL">URL格式化字符串</param>/// <param name="mGuid">綁定的列名(暫時只支持一個)</param>public ItemTemplateLinkBtn(string ColText, string navigateURL, string ColumnGuid){this.strColumnText = ColText;this.FormatString = navigateURL;this.FieldGuid = ColumnGuid;}/// <summary>/// 實例化單元格/// </summary>/// <param name="objContainer"></param>public void InstantiateIn(Control objContainer){HyperLink lnkbtn = new HyperLink();lnkbtn.DataBinding += new EventHandler(lnkbtn_DataBinding);lnkbtn.ToolTip = "點擊進去編輯";objContainer.Controls.Add(lnkbtn);}/// <summary>/// 數據綁定時執行的操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void lnkbtn_DataBinding(object sender, EventArgs e){HyperLink lnkbtn = (HyperLink)sender;// 此處類型轉換時請注意使用正確的類型 GrideView ->GridViewRow || DataViewGridViewRow container = (GridViewRow)lnkbtn.NamingContainer;object valuePara = ((DataRowView)container.DataItem)[this.FieldGuid];lnkbtn.Text = valuePara.ToString();// 設置格話后的參數lnkbtn.NavigateUrl = string.Format(FormatString, valuePara);} } #endregion#region Item Template for Label /// <summary> /// 創建標簽模板 /// </summary> public class ItemTemplateLabel : ITemplate {string strColumnText;string strLabelName;public ItemTemplateLabel(string ColText){this.strColumnText = ColText;}public ItemTemplateLabel(string ColText, string LabelName){this.strColumnText = ColText;this.strLabelName = LabelName;}/// <summary>/// 創建單元格實例/// </summary>/// <param name="objContainer"></param>public void InstantiateIn(Control objContainer){Label lbl = new Label();lbl.ID = strLabelName;lbl.DataBinding += new EventHandler(lbl_DataBinding);objContainer.Controls.Add(lbl);}/// <summary>/// 執行綁定/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void lbl_DataBinding(object sender, EventArgs e){Label lbl = (Label)sender;//lbl.ID = strLabelName;lbl.Text = strColumnText;} } #endregion}
有了這個類我們在創建模板列的時候就像創建一個普通的類一樣容易了。
<!-- lang: c# -->// 格式化的字符串string formatString = "ModuleEditMaster.aspx?PAGEID=" + PageID + "&GUID={0}";// 創建模板列TemplateFieldColumn pTemplate = new TemplateFieldColumn(column.Header, column.ColumnName, formatString);// 可以設置你像要的顯示效果pTemplate.HeaderStyle.Width = 60;pTemplate.ItemStyle.HorizontalAlign = HorizontalAlign.Center;// 加入到數據表格gdvPageView.Columns.Add(pTemplate);到這里 大功告成! 這里有一個小的參考
模板列在 PostBack 后消失的問題
【模板列的創建應在 GrideView_Init 或者 Page_Init 事件中創建來避免 PostBack 后消失的問題】 仔細去看的時候發現其實模板列并沒有消失,只是中間我們定義的控件消失了,但是同樣是動態創建的 BoundField 類型的普通列并沒有異常,猜想應該是我們自定義的控件狀態沒有被保存,而BoundField 的內容可能會包含某種標記( IStateManager )而被.Net 框架保存處理了。 所以我們被迫每次都要在數據綁定前重新定義模板列的內容。建議在GrideView_Init 或者 Page_Init 事件中創建。
轉載于:https://my.oschina.net/HenuToater/blog/141926
總結
以上是生活随笔為你收集整理的GideView 动态列模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 房地产企业大量海外融资,或将来资不抵债,
- 下一篇: androidHandler讲解