DataGrid动态绑定模板列
生活随笔
收集整理的這篇文章主要介紹了
DataGrid动态绑定模板列
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
需求說明:在DataGrid中顯示手機短信過濾類型(手機號碼,業(yè)務(wù)推廣短信,帳戶變動短信,節(jié)日祝福短信),表示是否向手機號碼相應(yīng)類型的短信。由于被過濾的短信類型可能會動態(tài)添加,因此綁定DataGrid時只能通過后臺動態(tài)綁定,以便增加短信類型時不用修改aspx頁面。下圖是示例的顯示效果,只要在獲取數(shù)據(jù)時增加“節(jié)日祝?!绷?#xff0c;頁面不需要做任何修改,顯示就由左圖內(nèi)容變成右圖內(nèi)容。
????
????? 實現(xiàn)過程:下面用代碼說明具體實現(xiàn)。
????? 1.aspx頁面部分,代碼很簡單,在頁面中放一個DataGrid就可以了。
?<form?id="form1"?runat="server">
????????<div>
????????????<asp:DataGrid?ID="dgSmsFilters"?Style="z-index:?101;?left:?264px;?position:?absolute;
????????????????top:?152px"?runat="server"?Width="480px"?Height="200px"?AutoGenerateColumns="False"
????????????????BorderColor="#3366CC"?BorderStyle="None"?BorderWidth="1px"?BackColor="White"
????????????????CellPadding="4">
????????????????<SelectedItemStyle?Font-Bold="True"?ForeColor="#CCFF99"?BackColor="#009999"></SelectedItemStyle>
????????????????<ItemStyle?ForeColor="#003399"?BackColor="White"></ItemStyle>
????????????????<HeaderStyle?Font-Bold="True"?ForeColor="#CCCCFF"?BackColor="#003399"></HeaderStyle>
????????????????<FooterStyle?ForeColor="#003399"?BackColor="#99CCCC"></FooterStyle>
????????????????<PagerStyle?HorizontalAlign="Left"?ForeColor="#003399"?BackColor="#99CCCC"?Mode="NumericPages">
????????????????</PagerStyle>
????????????</asp:DataGrid>
????????</div>
????</form>
?????? 2.aspx.cs后臺代碼部分,這部分的作用就是準備好數(shù)據(jù),并綁定到DataGrid中。我們注意到給模板列賦值時實例化了ColumnTemplate類。這個類是我們自己定義的類,也是后臺綁定模板列的核心所在,第三部分代碼將演示這個類的實現(xiàn)。
protected?void?Page_Load(object?sender,?EventArgs?e)
????????????{
????????????????if?(!Page.IsPostBack)
????????????????{
????????????????????this.BindGrid();
????????????????}
????????????}
????????????//準備示例數(shù)據(jù)
????????????private?DataTable?GetDates()
????????????{
????????????????DataTable?dtSmsFilters?=?new?DataTable("dtSmsFilters");
????????????????DataColumn?dcSmsNum?=?new?DataColumn("手機號",Type.GetType("System.String"));
????????????????dtSmsFilters.Columns.Add(dcSmsNum);
????????????????//產(chǎn)生短信過濾類型,實際應(yīng)根據(jù)數(shù)據(jù)庫中內(nèi)容動態(tài)生成的,列數(shù)可以動態(tài)添加
????????????????DataColumn?dcSmsFilterType1?=?new?DataColumn("業(yè)務(wù)推廣",Type.GetType("System.Boolean"));
????????????????dtSmsFilters.Columns.Add(dcSmsFilterType1);
????????????????DataColumn?dcSmsFilterType2?=?new?DataColumn("帳戶變動",Type.GetType("System.Boolean"));
????????????????dtSmsFilters.Columns.Add(dcSmsFilterType2);
????????????????DataColumn?dcSmsFilterType3?=?new?DataColumn("節(jié)日祝福",?Type.GetType("System.Boolean"));
????????????????dtSmsFilters.Columns.Add(dcSmsFilterType3);
????????????????//手動添加測試數(shù)據(jù)
????????????????DataRow?dr;
????????????????for(int?i=0;i<10;i++)
????????????????{
????????????????????//賦值,無實際意義,只為顯示
????????????????????dr?=?dtSmsFilters.NewRow();
????????????????????dr[0]?=?"1366666888"+i.ToString();
????????????????????dr[1]?=?i%2==0?true:false;
????????????????????dr[2]?=?i?%?3?==?0???true?:?false;
????????????????????dr[3]?=?i?%?4?==?0???true?:?false;
????????????????????dtSmsFilters.Rows.Add(dr);
????????????????}
????????????????return?dtSmsFilters;
????????????}
????????????//綁定DataGrid
????????????private?void?BindGrid()
????????????{
????????????????DataTable?dt?=?this.GetDates();
????????????????this.dgSmsFilters.DataSource?=?dt;
????????????????//添加綁定列,綁定手機號
????????????????BoundColumn?bc?=?new?BoundColumn();
????????????????bc.HeaderText?=?dt.Columns[0].ColumnName;
????????????????bc.DataField?=?dt.Columns[0].ColumnName;
????????????????this.dgSmsFilters.Columns.AddAt(0,bc);
????????????????//添加模板列,綁定過濾短信類型,模板列的列數(shù)是由函數(shù)GetDates()生成的DataTable的列數(shù)決定的
????????????????for(int?i=1;i<dt.Columns.Count;i++)
????????????????{
????????????????????TemplateColumn?tc?=?new?TemplateColumn();
????????????????????tc.HeaderText?=?dt.Columns[i].ColumnName;
????????????????????tc.ItemTemplate?=?new?ColumnTemplate("ckb"+i.ToString(),dt.Columns[i].ColumnName);
????????????????????this.dgSmsFilters.Columns.AddAt(i,tc);
????????????????}
????????????????this.dgSmsFilters.DataBind();
????????????}
????????3.ColumnTemplate類的實現(xiàn)。繼承自ITemplate接口,并實現(xiàn)了接口方法InstantiateIn(),定義子控件和模板所屬的 Control 對象。
?//ColumnTemplate?從ITemplate繼承。
????????//InstantiateIn?定義子控件的屬于誰
????????public?class?ColumnTemplate:System.Web.UI.ITemplate
????????{
????????????string?id;
????????????string?bindField;
????????????public?ColumnTemplate(string?id,string?bindField)
????????????{
????????????????this.id?=?id;
????????????????this.bindField?=?bindField;?
????????????}
????????????//Override?the?ITemplate.InstantiateIn?method?to?ensure?
????????????//that?the?templates?are?created?in?a?CheckBox?control?and
????????????//that?the?CheckBox?object's?DataBinding?event?is?associated
????????????//with?the?BindData?method.
????????????public?void?InstantiateIn(Control?container)
????????????{
????????????????CheckBox?ckb?=?new?CheckBox();
????????????????ckb.ID?=?this.id;
????????????????ckb.DataBinding?+=?new?EventHandler(this.BindData);
????????????????container.Controls.Add(ckb);
????????????}
????????????//Create?a?public?method?that?will?handle?the
????????????//DataBinding?event?called?in?the?InstantiateIn?method.
????????????public?void?BindData(object?sender,?EventArgs?e)
????????????{
????????????????CheckBox?ckb?=?(CheckBox)?sender;
????????????????DataGridItem?container?=?(DataGridItem)?ckb.NamingContainer;
????????????????string?isFilter?=?((DataRowView)?container.DataItem)[bindField].ToString();??
????????????????ckb.Checked?=?bool.Parse(isFilter);
????????????}
????????}
??????源代碼下載地址:?點擊下載完整示例程序 (示例路徑:/WebControls/TemplateColumnDemo.aspx)
????
????? 實現(xiàn)過程:下面用代碼說明具體實現(xiàn)。
????? 1.aspx頁面部分,代碼很簡單,在頁面中放一個DataGrid就可以了。
?<form?id="form1"?runat="server">
????????<div>
????????????<asp:DataGrid?ID="dgSmsFilters"?Style="z-index:?101;?left:?264px;?position:?absolute;
????????????????top:?152px"?runat="server"?Width="480px"?Height="200px"?AutoGenerateColumns="False"
????????????????BorderColor="#3366CC"?BorderStyle="None"?BorderWidth="1px"?BackColor="White"
????????????????CellPadding="4">
????????????????<SelectedItemStyle?Font-Bold="True"?ForeColor="#CCFF99"?BackColor="#009999"></SelectedItemStyle>
????????????????<ItemStyle?ForeColor="#003399"?BackColor="White"></ItemStyle>
????????????????<HeaderStyle?Font-Bold="True"?ForeColor="#CCCCFF"?BackColor="#003399"></HeaderStyle>
????????????????<FooterStyle?ForeColor="#003399"?BackColor="#99CCCC"></FooterStyle>
????????????????<PagerStyle?HorizontalAlign="Left"?ForeColor="#003399"?BackColor="#99CCCC"?Mode="NumericPages">
????????????????</PagerStyle>
????????????</asp:DataGrid>
????????</div>
????</form>
?????? 2.aspx.cs后臺代碼部分,這部分的作用就是準備好數(shù)據(jù),并綁定到DataGrid中。我們注意到給模板列賦值時實例化了ColumnTemplate類。這個類是我們自己定義的類,也是后臺綁定模板列的核心所在,第三部分代碼將演示這個類的實現(xiàn)。
protected?void?Page_Load(object?sender,?EventArgs?e)
????????????{
????????????????if?(!Page.IsPostBack)
????????????????{
????????????????????this.BindGrid();
????????????????}
????????????}
????????????//準備示例數(shù)據(jù)
????????????private?DataTable?GetDates()
????????????{
????????????????DataTable?dtSmsFilters?=?new?DataTable("dtSmsFilters");
????????????????DataColumn?dcSmsNum?=?new?DataColumn("手機號",Type.GetType("System.String"));
????????????????dtSmsFilters.Columns.Add(dcSmsNum);
????????????????//產(chǎn)生短信過濾類型,實際應(yīng)根據(jù)數(shù)據(jù)庫中內(nèi)容動態(tài)生成的,列數(shù)可以動態(tài)添加
????????????????DataColumn?dcSmsFilterType1?=?new?DataColumn("業(yè)務(wù)推廣",Type.GetType("System.Boolean"));
????????????????dtSmsFilters.Columns.Add(dcSmsFilterType1);
????????????????DataColumn?dcSmsFilterType2?=?new?DataColumn("帳戶變動",Type.GetType("System.Boolean"));
????????????????dtSmsFilters.Columns.Add(dcSmsFilterType2);
????????????????DataColumn?dcSmsFilterType3?=?new?DataColumn("節(jié)日祝福",?Type.GetType("System.Boolean"));
????????????????dtSmsFilters.Columns.Add(dcSmsFilterType3);
????????????????//手動添加測試數(shù)據(jù)
????????????????DataRow?dr;
????????????????for(int?i=0;i<10;i++)
????????????????{
????????????????????//賦值,無實際意義,只為顯示
????????????????????dr?=?dtSmsFilters.NewRow();
????????????????????dr[0]?=?"1366666888"+i.ToString();
????????????????????dr[1]?=?i%2==0?true:false;
????????????????????dr[2]?=?i?%?3?==?0???true?:?false;
????????????????????dr[3]?=?i?%?4?==?0???true?:?false;
????????????????????dtSmsFilters.Rows.Add(dr);
????????????????}
????????????????return?dtSmsFilters;
????????????}
????????????//綁定DataGrid
????????????private?void?BindGrid()
????????????{
????????????????DataTable?dt?=?this.GetDates();
????????????????this.dgSmsFilters.DataSource?=?dt;
????????????????//添加綁定列,綁定手機號
????????????????BoundColumn?bc?=?new?BoundColumn();
????????????????bc.HeaderText?=?dt.Columns[0].ColumnName;
????????????????bc.DataField?=?dt.Columns[0].ColumnName;
????????????????this.dgSmsFilters.Columns.AddAt(0,bc);
????????????????//添加模板列,綁定過濾短信類型,模板列的列數(shù)是由函數(shù)GetDates()生成的DataTable的列數(shù)決定的
????????????????for(int?i=1;i<dt.Columns.Count;i++)
????????????????{
????????????????????TemplateColumn?tc?=?new?TemplateColumn();
????????????????????tc.HeaderText?=?dt.Columns[i].ColumnName;
????????????????????tc.ItemTemplate?=?new?ColumnTemplate("ckb"+i.ToString(),dt.Columns[i].ColumnName);
????????????????????this.dgSmsFilters.Columns.AddAt(i,tc);
????????????????}
????????????????this.dgSmsFilters.DataBind();
????????????}
????????3.ColumnTemplate類的實現(xiàn)。繼承自ITemplate接口,并實現(xiàn)了接口方法InstantiateIn(),定義子控件和模板所屬的 Control 對象。
?//ColumnTemplate?從ITemplate繼承。
????????//InstantiateIn?定義子控件的屬于誰
????????public?class?ColumnTemplate:System.Web.UI.ITemplate
????????{
????????????string?id;
????????????string?bindField;
????????????public?ColumnTemplate(string?id,string?bindField)
????????????{
????????????????this.id?=?id;
????????????????this.bindField?=?bindField;?
????????????}
????????????//Override?the?ITemplate.InstantiateIn?method?to?ensure?
????????????//that?the?templates?are?created?in?a?CheckBox?control?and
????????????//that?the?CheckBox?object's?DataBinding?event?is?associated
????????????//with?the?BindData?method.
????????????public?void?InstantiateIn(Control?container)
????????????{
????????????????CheckBox?ckb?=?new?CheckBox();
????????????????ckb.ID?=?this.id;
????????????????ckb.DataBinding?+=?new?EventHandler(this.BindData);
????????????????container.Controls.Add(ckb);
????????????}
????????????//Create?a?public?method?that?will?handle?the
????????????//DataBinding?event?called?in?the?InstantiateIn?method.
????????????public?void?BindData(object?sender,?EventArgs?e)
????????????{
????????????????CheckBox?ckb?=?(CheckBox)?sender;
????????????????DataGridItem?container?=?(DataGridItem)?ckb.NamingContainer;
????????????????string?isFilter?=?((DataRowView)?container.DataItem)[bindField].ToString();??
????????????????ckb.Checked?=?bool.Parse(isFilter);
????????????}
????????}
??????源代碼下載地址:?點擊下載完整示例程序 (示例路徑:/WebControls/TemplateColumnDemo.aspx)
總結(jié)
以上是生活随笔為你收集整理的DataGrid动态绑定模板列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OutLook最小化到托盘
- 下一篇: PHP实现常见排序