首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

请问gridview动态添加模版列的有关问题

2012-01-10 
请教gridview动态添加模版列的问题我在动态添加的模版列中包含了一TextBox控件,但是没有办法通过gridview1

请教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>
/// 绑定DropDownList
/// </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字段
}
}
}

[解决办法]
只要没结帖,我就来顶上去。请高手继续解决!

热点排行