请教gridview动态添加模版列的问题
我在动态添加的模版列中包含了一TextBox控件,但是没有办法通过gridview1.rows[0].cells[2].FindControls( "txtValue ")访问到textbox控件?到底是为什么,该如何才能访问?
代码如下:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
for (int i = 0; i < 2; i++)
{
string colName = "分屯点 " + i.ToString();
TemplateField customField = new TemplateField();
customField.ShowHeader = true;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, colName);
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, " ");
customField.ItemStyle.Width = 200;
GridView1.Columns.Add(customField);
}
}
}
}
public class GridViewTemplate : ITemplate
{
private DataControlRowType templateType;
private string columnName;
public GridViewTemplate(DataControlRowType type, string colname)
{
templateType = type;
columnName = colname;
}
#region ITemplate 成员
void ITemplate.InstantiateIn(Control container)
{
switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow:
TextBox drr = new TextBox();
drr.ID = "txtValue ";
drr.Text = "0 ";
drr.Columns = 3;
container.Controls.Add(drr);
break;
default:
break;
}
}
#endregion
}
[解决办法]
俺不会 帮你顶
[解决办法]
try:
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < 2; i++)
{
string colName = "分屯点 " + i.ToString();
TemplateField customField = new TemplateField();
customField.ShowHeader = true;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, colName);
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, " ");
customField.ItemStyle.Width = 200;
GridView1.Columns.Add(customField);
}
}
去掉if (!IsPostBack)
[解决办法]
http://community.csdn.net/Expert/TopicView3.asp?id=5336957
每次回发后都要创建一下
[解决办法]
你的数据从哪里来的?
[解决办法]
点击Button以后,新增的两个模版列就自己消失了
=========================================
这个很容易解释,动态添加的控件无法维持它的状态,楼主了解一下页面的生存周期就知道了
[解决办法]
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
namespace Control_web
{
/// <summary>
/// DataWindow 的摘要说明。
/// </summary>
[DefaultProperty( "Text "),
ToolboxData( " <{0}:DataWindow runat=server> </{0}:DataWindow> ")]
public class DataWindow : System.Web.UI.WebControls.DataGrid
{
protected override void OnInit(EventArgs e)
{
base.OnInit (e);
this.AutoGenerateColumns=false;
}
private SysCommon.EntityBase.BaseDataSet Ety
{
get
{
return (SysCommon.EntityBase.BaseDataSet)ViewState[this.ID+ "ety "];
}
set
{
ViewState[this.ID+ "ety "]=value;
}
}
public override void DataBind()
{
this.Ety=(SysCommon.EntityBase.BaseDataSet)this.DataSource;
foreach(SysCommon.EntityBase.ColumnProperty cp in Ety.ColumnPropertyList)
{
//是否显示
if(cp.B_display)
{
//普通-只读
if(cp.E_showType==SysCommon.EntityBase.ShowType.Common && cp.B_readonly)
{
BoundColumn col=new BoundColumn();
col.HeaderText=cp.Column_memo;
col.DataField=cp.Column;
col.Visible=cp.B_display;
this.Columns.Add(col);
}
//普通-可写
if(cp.E_showType==SysCommon.EntityBase.ShowType.Common && !cp.B_readonly)
{
TemplateColumn coltb = new TemplateColumn();
coltb.ItemTemplate =new DataGridTemplate(ListItemType.Item,cp);
coltb.HeaderText = cp.Column_memo;
this.Columns.Add(coltb);
}
//列表
if(cp.E_showType==SysCommon.EntityBase.ShowType.DropDownList)
{
TemplateColumn collist = new TemplateColumn();
collist.ItemTemplate =new DataGridTemplate(ListItemType.Item,cp);
collist.HeaderText = cp.Column_memo;
this.Columns.Add(collist);
}
//sql语句
if(cp.E_showType==SysCommon.EntityBase.ShowType.Sql)
{
TemplateColumn colsql = new TemplateColumn();
colsql.ItemTemplate =new DataGridTemplate(ListItemType.Item,cp);
colsql.HeaderText = cp.Column_memo;
this.Columns.Add(colsql);
}
}
}
this.ItemDataBound+=new DataGridItemEventHandler(DataWindow_ItemDataBound);
base.DataBind ();
}
/// <summary>
/// 加载数据
/// </summary>
/// <param name= "sender "> </param>
/// <param name= "e "> </param>
private void DataWindow_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
{
foreach(SysCommon.EntityBase.ColumnProperty cp in Ety.ColumnPropertyList)
{
if(cp.E_showType==SysCommon.EntityBase.ShowType.DropDownList || cp.E_showType==SysCommon.EntityBase.ShowType.Sql)
{
DropDownList ddl=(DropDownList)e.Item.FindControl(cp.Column);
BindDropDownList(cp,ddl,e);
}
}
}
}
private string str_business_namespace= "Business ";
/// <summary>
/// 绑—ropDownList
/// </summary>
/// <param name= "cp "> </param>
/// <param name= "dropDownList "> DropDownList的id </param>
/// <param name= "str_selectValue "> 选中的值 </param>
private void BindDropDownList(SysCommon.EntityBase.ColumnProperty cp,DropDownList dropDownList,DataGridItemEventArgs e)
{
if(cp.E_showType==SysCommon.EntityBase.ShowType.DropDownList)
{
string[] str=cp.Column_enum;
System.Data.DataTable newt=new DataTable(cp.Column);
newt.Columns.Add(cp.Column_dropText);
newt.Columns.Add(cp.Column_dropValue);
int i_cnt=str.GetLength(0);
int i_index=0;
string str_id,str_name;
for(int i=0;i <i_cnt;i++)
{
System.Data.DataRow dr=newt.NewRow();
i_index=str[i].IndexOf( "| ");
str_name=str[i].Substring(0,i_index);
str_id=str[i].Substring(i_index + 1,str[i].Length - i_index - 1);
dr[cp.Column_dropText]=str_name;
dr[cp.Column_dropValue]=str_id;
newt.Rows.Add(dr);
}
dropDownList.DataSource=newt;
}
if(cp.E_showType==SysCommon.EntityBase.ShowType.Sql)
{
try
{
System.Reflection.Assembly assembly=System.Reflection.Assembly.Load(str_business_namespace);
Type t=assembly.GetType(str_business_namespace+ ". "+cp.Column_dropSql_tablename+ "BN ");
SysCommon.BussnessBase.BaseBusiness bn=(SysCommon.BussnessBase.BaseBusiness)System.Activator.CreateInstance(t);
dropDownList.DataSource=bn.getEty(null);
}
catch(Exception ex)
{
SysCommon.tool.TraceInfo.WriteInfo(ex);
return ;
}
}
dropDownList.DataTextField=cp.Column_dropText;
dropDownList.DataValueField=cp.Column_dropValue;
dropDownList.DataBind();
try
{
dropDownList.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,cp.Column))).Selected=true;
}
catch(Exception ex1)
{
SysCommon.tool.TraceInfo.WriteInfo(ex1);
}
}
}
/// <summary>
/// 下拉和数据绑定模板、输入框模板
/// </summary>
public class DataGridTemplate : ITemplate
{
private ListItemType templateType;
private SysCommon.EntityBase.ColumnProperty cp;
public DataGridTemplate(ListItemType itemType,SysCommon.EntityBase.ColumnProperty cpp)
{
this.cp=cpp;
this.templateType=itemType;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch(templateType)
{
case ListItemType.Header:
Literal hd=new Literal();
hd.Text=cp.Column_memo;
container.Controls.Add(hd);
break;
case ListItemType.Item:
if(cp.E_showType==SysCommon.EntityBase.ShowType.Common && !cp.B_readonly)
{
TextBox tb = new TextBox();
tb.ID=cp.Column;
tb.DataBinding+=new EventHandler(tb_DataBinding);
container.Controls.Add(tb);
}
if(cp.E_showType==SysCommon.EntityBase.ShowType.DropDownList || cp.E_showType==SysCommon.EntityBase.ShowType.Sql)
{
DropDownList drop = new DropDownList();
drop.ID = cp.Column;
container.Controls.Add(drop);
}
break;
case ListItemType.EditItem:
break;
case ListItemType.Footer:
break;
}
}
private void tb_DataBinding(object sender, EventArgs e)
{
TextBox l = (TextBox) sender;//LiteralControl发送绑定请求
DataGridItem container = (DataGridItem) l.NamingContainer;
l.Text = ((DataRowView)container.DataItem)[l.ID].ToString();//绑定stuname字段
}
}
}
[解决办法]
只要没结帖,我就来顶上去。请高手继续解决!