GridView动态添加列,刷新(回发),模板列的控件丢失

kingcsx666 2009-12-14 11:12:05
背景资料:动态添加网格的所有列或者部分列,其中第一列模板列(TemplateField),内涵CheckBox控件

后面为普通数据列(BoundField)。动态数据列为按钮事件(btnSelect)里面根据参数动态取数生成的普通绑定列,

故创建网格列的代码不可能放在Page_Load事件里面


几种情况测试:

A.全部动态添加列,在btnSelect事件,首先clear()一下GridView,把所有列清除,再重新添加(add)

CheckBox列(模板列)和数据列,结果只要页面上的其他回发事件触发,网格模板列中的控件都丢失;

B.用设计器设计好第一列CheckBox(模板列),在动态添加Add()或者Insert()其他数据列,

btnSelect事件重复删除添加数据列,只要动态添加删除了网格的列,网格模板列中的控件丢失,

即第一列(模板列)里面的控件照样丢失.不用RemoveAt()或者Remove()方法,模板列的控件就不会丢失,

但是网格的数据列翻倍增加,属正常,应为没有删除前面的列又增加了新列;

C.不动态添加删除,没问题。


测试结果分析:只要对网格列进行clear(),RemoveAt(),Remove()操作,网格中模板列

中的控件在回发事件后,控件都会消失,但是模板列还是存在的,即列里面没东西

请各位帮忙分析一下原因,和具体解决方案?不胜感激

代码如下:

//添加模板列,GridViewTemplate为现实ITemplate接口的类
TemplateField tfCheck = new TemplateField();
tfCheck.ShowHeader = true;
tfCheck.HeaderTemplate = new Common.GridViewTemplate(DataControlRowType.Header, "选择");
tfCheck.ItemTemplate = new Common.GridViewTemplate(DataControlRowType.DataRow, "chkSelect");
grdData.Columns.Add(tfCheck);
//添加普通列
for (int i = 0; i < dtSource.Columns.Count; i++)
{
BoundField bfColObjec = new BoundField();
bfColObjec.HeaderText = dtSource.Columns[i].Caption;
bfColObjec.DataField = dtSource.Columns[i].ColumnName;
bfColObjec.ShowHeader = true;
bfColObjec.Visible = true;
grdData.Columns.Add(bfColObjec);
}
...全文
1354 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
williamxia8 2012-07-10
  • 打赏
  • 举报
回复
protected override void CreateChildControls()
{
AddFilter();
base.CreateChildControls();
}

protected void AddFilter()
{
int k = 0;
Int32 count=Convert.ToInt32(ViewState["GridViewColumnCount"]);
foreach (GridViewRow row in GridView2.Rows)
{
string textbox = row.Cells[0].Text;
TextBox txtbox;
for (int i = 0; i < count; i++)
{
txtbox = new TextBox();
txtbox.ID = "TextBox" + i.ToString();
txtbox.Width = 100;
txtbox.Text = row.Cells[i].Text;
row.Cells[i].Controls.Add(txtbox);
}
k++;
}
}
代码里面加上这个就可以了
williamxia8 2012-07-10
  • 打赏
  • 举报
回复
我是先动态生成按钮,然后用动态生成的按钮再动态生成GridView,Gridview里面生成好多TextBox,之后我就编辑TextBox里面的数据,在后台无法获得这些TextBox的值,这到底该如何是好呢?》
扬眉剑出鞘Gu 2011-10-19
  • 打赏
  • 举报
回复
#19楼

此楼正解! 写到这里 不会丢失!
jtkuyjjhjkfyguii 2011-09-22
  • 打赏
  • 举报
回复
protected override void OnInit(EventArgs e)
{
#region 动态创建模板列

TemplateField operationSum = new TemplateField();
operationSum.ItemStyle.HorizontalAlign = HorizontalAlign.Right;
operationSum.ItemStyle.Width = 100;
Label lblSum = new Label();
lblSum.ID = "lblSum";
lblSum.Text = "Id^总计{0}";
List<Control> sumControlList = new List<Control>();
sumControlList.Add(lblSum);
operationSum.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "总计");
operationSum.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, sumControlList);
sgvFile.Columns.Add(operationSum);

#endregion
}


写到OnInit事件里 没有问题
kingcsx666 2011-02-17
  • 打赏
  • 举报
回复
因后续一些朋友一直在询问,问题是如何解决的,在这里统一回答:

1、GridView_RowCreated事件中重新添加绑定对应的控件

这样控件就依然存在(实际是丢失的,这里是重新添加绑定),

结果看起来是一样

后续我做的网格也都是动态生成的。

这样问题得以解决。

谢谢!


linanwang 2010-06-03
  • 打赏
  • 举报
回复
我也遇到了类似的情况,杯具啊~~~
kingcsx666 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 happyhippy 的回复:]
我遇到同样的问题了,郁闷阿郁闷....
试了一天还没有搞定,折腾阿折腾....
[/Quote]

这个是微软的bug,目前暂无实现办法
happyhippy 2010-01-30
  • 打赏
  • 举报
回复
我遇到同样的问题了,郁闷阿郁闷....
试了一天还没有搞定,折腾阿折腾....
阿非 2009-12-15
  • 打赏
  • 举报
回复
还没解决?
Accelerator 2009-12-15
  • 打赏
  • 举报
回复
没试过
用Table来写,想怎么变就怎么变
kingcsx666 2009-12-15
  • 打赏
  • 举报
回复
微软也没解释,

测试代码稍后整理上来
kingcsx666 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sandy945 的回复:]
还没解决?
[/Quote]

这个问题估计是无解

只要对gridview的列现实过删除操作(remove,removeAt,clear),

在页面第二次回发(刷新),不管模板列是动态创建,还是设计器创建的,模板列的所有控件都会丢失

已经测试过n次了

阿非 2009-12-14
  • 打赏
  • 举报
回复
阿非 2009-12-14
  • 打赏
  • 举报
回复
button 的 click 事件 是不行的
kingcsx666 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sandy945 的回复:]
控件在那里添加的

在那个事件添加的
[/Quote]

btnSelect按钮事件
阿非 2009-12-14
  • 打赏
  • 举报
回复
控件在那里添加的

在那个事件添加的
kingcsx666 2009-12-14
  • 打赏
  • 举报
回复
up,控件在GridViewTemplate类里面的接口创建的
nanfei521 2009-12-14
  • 打赏
  • 举报
回复
GridView 动态添加的内容应该放在xxxxCreated事件中,它会在每次加载时自动创建,如果它在created事件之前创建,会被自动覆盖,所以丢失了
阿非 2009-12-14
  • 打赏
  • 举报
回复
控件在那里添加的
zqtoo 2009-12-14
  • 打赏
  • 举报
回复
帮顶
加载更多回复(2)

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧