思归等高手请进:如何hook在datagrid中动态添加的控件

athossmth 2004-12-01 04:56:17
datagrid中动态添加控件是容易的,只需要在ItemDataBound事件的处理函数中
e.Item.Cells(1).Controls.Add(myServerControl)
就可以了,

hook在form中动态添加的空间是容易的,见
http://support.microsoft.com/kb/317515/EN-US/
HOW TO: Dynamically Create Controls in ASP.NET with Visual Basic .NET

现在,想在datagrid中动态添加控件,并hook它,上文中提到:
Note
When you create dynamic controls on a Web Form, you must create the controls and add them to the controls collection in either the Page_Init event handler or the Page_Load event handler. Otherwise, the controls may not behave as expected.

这就矛盾了,我试着只是把controls.add的地方从page_init改到myDataGrid_ItemDataBound中,就hook不到了。

有什么办法吗?多谢!
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cherish58 2005-08-12
  • 打赏
  • 举报
回复
高手,顶
athossmth 2004-12-02
  • 打赏
  • 举报
回复
非常感谢各位的讲解。
singleflower 2004-12-01
  • 打赏
  • 举报
回复
听课
goody9807 2004-12-01
  • 打赏
  • 举报
回复
ItemDataBound,ItemCreated
首先要说的是这两个事件的发生时间。
ItemDataBound嘛,只要执行了DataBind方法,就会马上激发这个事件。
ItemCreated呢,如果页面是第一次访问(Page.IsPostBack = false),那在第一次执行DataBind的时候,会先激发ItemCreated事件,也就是说,执行了DataBind后,首先会用ItemCreated来建立Header行,然后用ItemDataBound来绑定Header行,再用ItemCreated来建立第一行,再调用ItemDataBound来绑定第一行,也就是说ItemCreated和ItemDataBound是交替执行的。
页面返回时,也会执行ItemCreated事件,在Page_Load之前,但是这时候就不会再执行ItemDataBound事件了。
所以,如果你想在DataGrid里动态添加什么控件,就需要在ItemCreated事件中,而不是在ItemDataBound事件中。
Proyang 2004-12-01
  • 打赏
  • 举报
回复
ItemCreated 事件,或者ItemDataBind事件,都可以
yichuan1982 2004-12-01
  • 打赏
  • 举报
回复
没有语言了,只有看的份,呵
SVG 2004-12-01
  • 打赏
  • 举报
回复
继思归:
再, 最好是将
Button btn 定义为全局变量,
每次Datagrid的Item Created 时
判断下btn == null 否, 否则new它.

如果要create n 个dynamic control, 可以将所有的control放进panel里, 再将panel放进session等什么的保存起来.
Truly 2004-12-01
  • 打赏
  • 举报
回复
有死鬼在,我英文都有提高
46539492 2004-12-01
  • 打赏
  • 举报
回复
还是思归大哥厉害,象你学习!
saucer 2004-12-01
  • 打赏
  • 举报
回复
add the controls in ItemCreated event handler and do the corresponding databinding in ItemDataBound event handler, since OnItemCreated is called upon postback, if you have any event handlers to those dynamic controls, add the handlers there

void DataGrid_ItemCreated(Object sender, DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
{

Button btn = new Button();
btn.ID = "xyz";
btn.Text = "Click Me";
btn.Click += new EventHandler(.....);
e.Item.Cells[2].Controls.Add(btn);

}

}



void DataGrid_ItemDataBound(Object sender, DataGridItemEventArgs e)
{

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
{

object o = DataBinder.Eval(e.Item.DataItem,"MyColumn");
Button btn = (Button)e.Item.FindControl("xyz");
btn.Text = o.ToString();
}

}


62,047

社区成员

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

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

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

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