一、动态添加模板列:

1、建立模板列样式:

说明:下边代码可以直接写在aspx文件中,也可以单独建立cs文件;另外,我没有写button、linkButton等控件,意思差不多,不过当需要添加事件时,记得将事件名称传入,并附加在控件上

public class GridViewTemplate : ITemplate
{
/// <summary>
/// 模板类型:标题或内容;
/// DataControlRowType.Header和DataControlRowType.DataRow
/// </summary>
private DataControlRowType P_TemplateType;
/// <summary>
/// 列的名称:列标题时,为列显示名称;列内容时,为列的字段名称
/// </summary>
private string P_ColumnName;
/// <summary>
/// 列的类型:TextBox、DropDownList等
/// </summary>
private string P_ColumnType;

public GridViewTemplate()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 构造函数:动态添加模版列
/// </summary>
/// <param name="TemplateType">模板类型:标题或内容;DataControlRowType.Header和DataControlRowType.DataRow</param>
/// <param name="ColumnName">列的名称:列标题时,为列显示名称;列内容时,为列的字段名称</param>
/// <param name="ColumnType">列的类型:列标题时,可为空;列内容时,为模板列的控件类型</param>
public GridViewTemplate(DataControlRowType TemplateType, string ColumnName, string ColumnType)
{
P_TemplateType = TemplateType;
P_ColumnName = ColumnName;
P_ColumnType = ColumnType;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (P_TemplateType)
{
case DataControlRowType.Header://列标题
Literal lc = new Literal();
lc.Text = P_ColumnName;
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow://模版列内容

if (P_ColumnType.ToUpper() == "TextBox".ToUpper())
{
TextBox tb = new TextBox();
tb.ID = "txt_" + P_ColumnName;
tb.AutoPostBack = true;
tb.EnableViewState = true;
//tb.Text = "";
tb.DataBinding += new EventHandler(tb_DataBinding);
container.Controls.Add(tb);
}
else if (P_ColumnType.ToUpper() == "Label".ToUpper())
{
System.Web.UI.WebControls.Label lb = new Label();
lb.ID = "lbl_" + P_ColumnName;
lb.EnableViewState = true;
//tb.Text = "";
lb.DataBinding += new EventHandler(lb_DataBinding);
container.Controls.Add(lb);
}
else
{ //默认为TextBox
TextBox tb = new TextBox();
tb.ID = "txt_" + P_ColumnName;
tb.AutoPostBack = true;
tb.EnableViewState = true;
tb.DataBinding += new EventHandler(tb_DataBinding);
container.Controls.Add(tb);
}

break;
default:
break;
}
}
void tb_DataBinding(object sender, EventArgs e)
{
TextBox txtdata = (TextBox)sender;
GridViewRow container = (GridViewRow)txtdata.NamingContainer;
object dataValue = DataBinder.Eval(container.DataItem, P_ColumnName);
if (dataValue != DBNull.Value)
{
txtdata.Text = dataValue.ToString();
}
}
void lb_DataBinding(object sender, EventArgs e)
{
Label lbldata = (Label)sender;
GridViewRow container = (GridViewRow)lbldata.NamingContainer;
object dataValue = DataBinder.Eval(container.DataItem, P_ColumnName);
if (dataValue != DBNull.Value)
{
lbldata.Text = dataValue.ToString();
}
}

}

2、前台aspx文件:

<asp:GridView ID="gvData" runat="server" SkinID="GridView" Width="100%" UseAccessibleHeader="False"
AutoGenerateColumns="False"  AllowPaging="True"
PageSize="100" onload="gvData_Load" >
<PagerSettings Visible="False" />
<HeaderStyle Font-Bold="True" />
</asp:GridView>

3、aspx.cs文件--创建GridView,并绑定数据:

说明:dt是外部获取的数据,我是根据数据表,动态生成GridView,并赋值

private void CreateDT(DataTable dt)
{

this.gvData.Columns.Clear();

TemplateField customField = new TemplateField();

for (int i = 0; i < dt.Columns.Count; i++)
{
customField = new TemplateField();
customField.ShowHeader = true;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, dt.Columns[i].ColumnName, "");
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, dt.Columns[i].ColumnName, "TextBox");
ViewState["txt_" + dt.Columns[i].ColumnName] = true;
gvData.Columns.Add(customField);
}

//绑定数据

this.gvData.DataSource = dt;
this.gvData.DataBind();

}

4、aspx.cs文件:重复建立并绑定数据,因为动态生成控件时,只要有刷新,所有的动态控件就全部消失,所以需要每次刷新都要重新绑定一次;

另外,我试过在OnInit、gvData_Init等事件中执行建立并绑定数据的操作,都可以实现,但是对于我不大适用,因为我是根据TreeView的选中项,来创建绑定GridView的;其他事件执行时机靠前,无法获取TreeView的选中项是哪个,而gvData_Load事件可以(虽然该事件也是在TreeView选中事件前执行,不过并不影响选中项的变化和获取到的内容)

protected void gvData_Load(object sender, EventArgs e)
{
DataTable dt=GetData();
CreateDT(dt);
}

5、aspx.cs文件:点击按钮,获取前台修改过的gvData中模板列的数据:

说明:我的保存时,先将数据保存进ViewState["DtData"]后,再执行保存功能;这么做是因为别的页面的问题,需要获取后,再刷新;不过大致意思都是相同的

注意:也可以使用TextBox txt= (TextBox)gvData.Rows[i].FindControl("txt_"+dtData.Columns[j].ColumnName);获取

private void SaveToTable()
{

DataTable dtData = (DataTable)ViewState["DtData"];
for (int i = 0; i < this.gvData.Rows.Count; i++)
{
for (int j = 0; j < dtData.Columns.Count; j++)
{

string txtName = "gvData$ctl" + (i + 2).ToString().PadLeft(2, '0') + "$txt_" + dtData.Columns[j].ColumnName;
if (Request.Form[txtName] != null)
{//目前仅能通过这个判断
dtData.Rows[i][j] = Request.Form[txtName];
JsService.ResponseMessage(this.UpdatePanel1, this.GetType(), "txtName:" + txtName + "----" + Request.Form[txtName]);
break;
}

}

}

ViewState["DtData"] = dtData;

}

6、实际上最主要的再gvData_Load事件中重复的动态创建并获取数据.

asp.net动态添加GridView的模板列,并获取列值的更多相关文章

  1. asp.net 动态添加自定义控件

    前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...

  2. ASP.NET动态添加用户控件的方法

    本文实例讲述了ASP.NET动态添加用户控件的方法.分享给大家供大家参考.具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返 ...

  3. asp.net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  4. 根据Excel列类型获取列的值

    using System.Data; using System.IO; using System.Text; using System.Web; using NPOI.SS.UserModel; us ...

  5. ASP.NET给Table动态添加删除行,并且得到控件的值

    ASP.NET给Table动态添加控件并且得到控件的值 由于跟老师做一个小的项目,可是我自己又不太懂js,所以一直为动态建立表格并且能动态的取值和赋值感到苦恼.起初在网上找到了一些js资源,解决了动态 ...

  6. ASP申请单动态添加实现方法及代码

    一个申请单可以包含N个项目,添加申请单时就需要动态加入代码了. 动态Table表格 以下为引用的内容: <table border="0" width="98%&q ...

  7. asp.net 动态添加多个用户控件

    动态添加多个相同用户控件,并使每个用户控件获取不同的内容. 用户控件代码: 代码WebControls using System; using System.Collections.Generic;  ...

  8. .NET 后台动态添加GridView列

    BoundField bfColumn1 = new BoundField(); bfColumn1.DataField = "zbcompanyname"; bfColumn1. ...

  9. ASP.Net动态创建GridView

    1.创建Field BoundField requestitem = new BoundField();//注意Field可以是ButtonField,TemplateField,...等等GridV ...

随机推荐

  1. Android开发教程AnimationDrawable逐帧播放动画

    下面我们一起来看篇Android开发AnimationDrawable控制逐帧播放动画实现过程,希望文章对各位朋友带不一些帮助. 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的 ...

  2. HTML中Meta标签大全

    在网页的HTML源代码中一个重要的代码“”(即通常所说的META标签).META标签用来描述一个HTML网页文档的属性,例如作者.日期和时间.网页描述.关键词.页面刷新等. 1.META标签的keyw ...

  3. 收缩SQL数据库日志

    各位同学,相信大家在使用SQL数据库时,常常会遇到日志文件比数据库文件还在大的情况.以下有一简单的办法,可以快速的删除日志档.使用其大小变为540K. 供各位参考. DUMP TRANSACTION ...

  4. HTML5高防win8风格

    使用HTML5做了一个高防Win8的页面,大家看看怎么样 Java..NET.PHP.Android.iOS.HTML5,CSS3. web前端.视频资料下载网站  http://51pansou.c ...

  5. centos6.7下编译安装lnmp

    很多步骤不说明了,请参照本人的centos6.7下编译安装lamp,这次的架构是nginx+php-fpm一台服务器,mysql一台服务器 (1)首先编译安装nginx: 操作命令: yum -y g ...

  6. PHP伪造referer突破防盗链

    php伪造referer实例代码,主要用于一些突破防盗链. 可以从这个例子中发展出很多的应用.比如隐藏真实的URL地址……嘿嘿,具体的就自己分析去吧 这里新建一个文件file.php.后面的参数就是需 ...

  7. Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

    摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/, ...

  8. STM32F4_RCC系统时钟配置及描述

    Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...

  9. 第九章 管理类型(In .net4.5) 之 继承机制

    1. 概述 本章包括 设计和实现接口.创建和使用基类 以及 使用.net类库提供的标准接口. 2. 主要内容 2.1 设计和实现接口 一个接口包含公共的方法.属性.事件.索引器.类和结构都可以实现接口 ...

  10. feel

    昨天我大脑中还在盘旋几个关键字:健康 选择 方向 方法今天只有选择了,健康 是你选择了一种生活习惯,你能掌控的也就是好的习惯,选择了一种正确的价值观,选择了一个好的开始方向有很多,你的选择是结果方法 ...