DataGrid动态添加模板列并合并头

it2022-05-09  25

测试库 1CREATE TABLE [T_NanshouyongTest] (2    [ProvName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,3    [AnserOne] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,4    [AnserOnePoint] [int] NULL ,5    [AnserTwo] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,6    [AnserTwoPoint] [int] NULL 7) ON [PRIMARY]8GO CTemplateCol.cs  1using System; 2using System.Web.UI; 3using System.Web.UI.WebControls; 4using System.Data; 5 6namespace Test1.ItemplateTest 7{ 8    public class CTemplateCol:ITemplate 9    {10        private string colname;11        TextBox l;12        public CTemplateCol(string cname)13        {14            colname=cname;15        }1617        //must implement following method18        public void InstantiateIn(Control container)19        {20            l = new TextBox();21            l.ID=colname;22            l.DataBinding +=23                new EventHandler(this.OnDataBinding);24            container.Controls.Add(l);25        }26        public void OnDataBinding(object sender, EventArgs e)27        {28            TextBox l = (TextBox) sender;29            DataGridItem container =30                (DataGridItem) l.NamingContainer;31            l.Text =32                ((DataRowView)33                container.DataItem)[colname].ToString();34        }35    }3637}38 CTemplateColLabel.cs  1using System; 2using System.Web.UI; 3using System.Web.UI.WebControls; 4using System.Data; 5 6namespace Test1.ItemplateTest 7{ 8    /**//// <summary> 9    /// CTemplateColLabel 的摘要说明。10    /// </summary>11    public class CTemplateColLabel:ITemplate12    {13        private string colname;14        Label l;15        public CTemplateColLabel(string cname)16        {17            colname=cname;18        }1920        public void InstantiateIn(Control container)21        {22            l = new Label();23            l.ID=colname;24            l.DataBinding +=25                new EventHandler(this.OnDataBinding);26            container.Controls.Add(l);        27        }2829        public void OnDataBinding(object sender, EventArgs e)30        {31            Label l = (Label) sender;32            DataGridItem container =33                (DataGridItem) l.NamingContainer;34            l.Text =35                ((DataRowView)36                container.DataItem)[colname].ToString();37        }38    }39}40 asp.net Html  1<%@Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Test1.WebForm1" %> 2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 3<HTML> 4    <HEAD> 5        <title>WebForm1</title> 6        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"> 7        <meta content="C#" name="CODE_LANGUAGE"> 8        <meta content="JavaScript" name="vs_defaultClientScript"> 9        <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">10    </HEAD>11    <body>12        <form id="Form1" method="post" runat="server">13            <asp:DataGrid id="grdMytest" runat="server" AutoGenerateColumns="False">14                <Columns>15                    <asp:BoundColumn DataField="ProvName" HeaderText="投标人"></asp:BoundColumn>16                </Columns>17            </asp:DataGrid>18            <asp:Button id="Button1" runat="server" Text="Button"></asp:Button>19        </form>20    </body>21</HTML>22 后台代码   1using System;  2using System.Collections;  3using System.ComponentModel;  4using System.Data;  5using System.Drawing;  6using System.Web;  7using System.Web.SessionState;  8using System.Web.UI;  9using System.Web.UI.WebControls; 10using System.Web.UI.HtmlControls; 11 12using System.Data.SqlClient; 13using  Test1.ItemplateTest; 14 15namespace Test1 16{ 17    /**//// <summary> 18    /// WebForm1 的摘要说明。 19    /// </summary> 20    public class WebForm1 : System.Web.UI.Page 21    { 22        protected System.Web.UI.WebControls.Button Button1; 23        protected System.Web.UI.WebControls.DataGrid grdMytest; 24 25 26        private void Page_Load(object sender, System.EventArgs e) 27        { 28            //添加应答列 29            TemplateColumn tc1 = new TemplateColumn(); 30            tc1.ItemTemplate = new CTemplateColLabel("AnserOne"); 31            grdMytest.Columns.Add(tc1); 32 33            //添加分数列 34            TemplateColumn tc2=new TemplateColumn(); 35            tc2.ItemTemplate=new CTemplateCol("AnserOnePoint");  36            grdMytest.Columns.Add(tc2); 37 38            //添加应答列 39            TemplateColumn tc3 = new TemplateColumn(); 40            tc3.ItemTemplate = new CTemplateColLabel("AnserTwo"); 41            grdMytest.Columns.Add(tc3); 42 43            //添加分数列 44            TemplateColumn tc4=new TemplateColumn(); 45            tc4.ItemTemplate=new CTemplateCol("AnserTwoPoint");                46            grdMytest.Columns.Add(tc4); 47 48            SqlConnection con = new SqlConnection("Persist Security Info=false;Data Source=192.168.0.9;Initial Catalog=TjgpE;User ID=sa;Password=;"); 49            SqlDataAdapter da = new SqlDataAdapter("select * from T_NanshouyongTest",con); 50            DataTable dt = new DataTable(); 51            da.Fill(dt); 52            grdMytest.DataSource = dt; 53            grdMytest.DataBind(); 54        } 55 56        Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码 57        override protected void OnInit(EventArgs e) 58        { 59            // 60            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 61            // 62            InitializeComponent(); 63            base.OnInit(e); 64        } 65         66        /**//// <summary> 67        /// 设计器支持所需的方法 - 不要使用代码编辑器修改 68        /// 此方法的内容。 69        /// </summary> 70        private void InitializeComponent() 71        {     72            this.grdMytest.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.grdMytest_ItemCreated); 73            this.Button1.Click += new System.EventHandler(this.Button1_Click); 74            this.Load += new System.EventHandler(this.Page_Load); 75 76        } 77        #endregion 78 79        private void grdMytest_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) 80        { 81            if(e.Item.ItemType == ListItemType.Header) 82            { 83                e.Item.SetRenderMethodDelegate(new RenderMethod(NewRenderMothodItem));//输出流重定向(按项目) 84            } 85        } 86 87        private void NewRenderMothodItem(HtmlTextWriter writer,Control ctl) 88        { 89            //输出第一行第一列(投标人名称) 90           TableCell cell0 = new TableCell(); 91            cell0.RowSpan = 2; 92            cell0.Text = "投标人名称"; 93            cell0.RenderControl(writer); 94 95            //输出要合并的第一行 96            TableCell cell = new TableCell(); 97            cell.Text = "资信要求"; 98            cell.ColumnSpan = 4; 99            cell.HorizontalAlign = HorizontalAlign.Center;100            cell.RenderControl(writer);101102            //添加一行103            writer.RenderBeginTag(HtmlTextWriterTag.Tr);104            //添加合并的第二行第一列105            cell = null;106            cell = new TableCell();107            cell.ColumnSpan = 2;108            cell.Text = "问:质保";109            cell.HorizontalAlign = HorizontalAlign.Center;110            cell.RenderControl(writer);111112            //添加合并的第二行第二列113            cell = null;114            cell = new TableCell();115            cell.ColumnSpan = 2;116            cell.Text = "问:售后";117            cell.HorizontalAlign = HorizontalAlign.Center;118            cell.RenderControl(writer);119120            writer.RenderEndTag();//</tr>121122        }123124        private void Button1_Click(object sender, System.EventArgs e)125        {126            foreach(DataGridItem item in grdMytest.Items)127            {128                TextBox txtPoint = (TextBox)item.FindControl("AnserOnePoint");129                Response.Write(txtPoint.Text.Trim()+"<br>");130            }131        }132    }133}

其实这种动态生成的页面,最大的难点还是在生成的算法上。明天好好想想。

转载于:https://www.cnblogs.com/nanshouyong326/archive/2006/12/25/603372.html


最新回复(0)