日期:2014-05-18  浏览次数:20484 次

关于Repeater嵌套控件,我也有一个问题:如何避免两次绑定?
作一个下拉式菜单,用Repeater1作为主菜单,Repeater2作为子菜单。
在Repeater1里面嵌Repeater2,而这个数据源所需的参数是必须由外层Repeater1绑定值以后才能提供的,
这就出现了问题,当外层执行完时我没有办法在Repater2绑定之前获取外层的值.结果Repater2立刻执行了一次徒劳的、无任何参数的绑定.

然后才用OnItemDataBound事件对内层Repeater2执行了第二次正确的绑定.

如以下代码:
  protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
  {
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
  ((ObjectDataSource)e.Item.FindControl("odsSubMenu")).SelectParameters["pID"].DefaultValue = ((HiddenField)e.Item.FindControl("hdnMenuID")).Value;
  ((Repeater)e.Item.FindControl("Repeater2")).DataBind();
  }
  }
我试过用OnItemCreated事件,但是那样用FindControl得不到任何子控件。

------解决方案--------------------
先帮顶mark
------解决方案--------------------
作一个下拉式菜单,用Repeater1作为主菜单,Repeater2作为子菜单。 

请问楼主想要实现什么效果?
------解决方案--------------------
在外层Repeater1绑定完成时,确实没有相应的参数传递过去
LZ的思路也是正确的,但我们可能在其中加一个判断再进行内层Repeater2的数据绑定
像可以判断当没有参数时,我们就不执数第二个Repeater1控件的数据绑定

C# code

protected   void   Repeater1_ItemDataBound(object   sender,   RepeaterItemEventArgs   e) 
{ 
     if(e.Item.ItemType   ==   ListItemType.Item   ¦ ¦   e.Item.ItemType   ==   ListItemType.AlternatingItem) 
     { 
         if(!其控件的参数值为初始值或是默认认值是)
{
                                ((ObjectDataSource)e.Item.FindControl( "odsSubMenu ")).SelectParameters[ "pID "].DefaultValue   =   ((HiddenField)e.Item.FindControl( "hdnMenuID ")).Value; 
((Repeater)e.Item.FindControl( "Repeater2 ")).DataBind(); 

}
else
{             则不进行任何操作                  } 
}

------解决方案--------------------
如果LZ用的是repeater嵌套,确有这个问题,楼主何不尝试用两个Repeater来实现功能,那样就不会有类似的问题发生了
------解决方案--------------------
路过 帮顶