1.在母版页中,如果需要找母版页中的控件:
this.FindControl("控件ID");2.在母版页中,如果需要找ContentPage的控件,可以用:
this.FindControl("ContentPlaceHolderID").FindControl("控件ID");3.在ContentPage中,如果需要找母版页中的控件,可以直接调用:
this.Master.FindControl("控件ID");4.可是,为什么在ContentPage中找自己页面里的控件,必须先通过找到母版页中的ContentPlaceHolder,然后再找其中的控件:
this.Master.FindControl("ContentPlaceHolderID").FindControl("控件ID");难道ContentPage连自己页面里的控件,都不能直接通过:
this.FindControl("控件ID");来找到吗?这种设计太怪异了,敢问各位前辈,这到底是为什么?

解决方案 »

  1.   

    查看源文件 控件的Id变了,控件的Id被加上了ContentPlaceHolderID_,所以你找不到
      

  2.   

    多谢楼上大侠提示,可是FindControl方法调用的时候,后台代码还没有被渲染成html控件,那时候控件的id应该还是和aspx中定义的一样的吧,这时候难道就不能通过id直接在ContentPage中找到自己页面中的控件么?
      

  3.   

    一个页面里控件的ID是可以相同的,但UniqueID肯定不能不同。
      

  4.   

    FindControl是通过ID去寻找控件的,跟UniqueID没有关系。同一页面中控件的ID是可以相同的,但UniqueID肯定各不相同。
      

  5.   

    FindControl是通过ID去寻找控件的,跟UniqueID没有关系。同一页面中控件的ID是可以相同的,但UniqueID肯定各不相同。
      

  6.   

    这是很基本的概念,大概你没有遇到过一次真正懂asp.net的入门书或者教程。FindControl就是向下遍历所有控件?胡说八道。这是不懂FindControl的。请你搞清楚FindControld的机制,它绝对不是遍历某一控件的所有子控件。
      

  7.   

    这是很基本的概念,大概你没有遇到过一次真正懂asp.net的入门书或者教程。FindControl就是向下遍历所有控件?胡说八道。这是不懂FindControl的。请你搞清楚FindControld的机制,它绝对不是遍历某一控件的所有子控件。这里我买一个“关子”,只是给你更加扩展一点的其实。比如说在一些数据绑定控件某些列,你可以用Item.FindControl可以找到同级甚至更高级的控件,例如你可以在GridView的Cell[3]中执行FindControl("abc"而找到第0号单元格下面的叫做abc的子控件,这叫“向下遍历控件”吗?FindControl的机制,我们就可以在招聘时考察一个程序员是真正找人学过asp.net编程还是业余的。真的。
      

  8.   

    买一个“关子”   -->  卖一个“关子”
    你的这个问题问得非常好。但是我觉得最近csdn的气氛,还是期望自己去深入理解asp.net的findcontrol的源代码,有一点心得然后讨论比较好。自己读一些源代码,培养动手去看源代码的思路,不要都是深手让别人灌输一点概念。
      

  9.   

    同一页面里的控件ID是可以相同的,但UniqeID肯定是不同的。
    楼主的问题其实跟“命名容器”这个概念有关。比如Page下放一个文本框,ID为TextBox1,在GridView里再放一个TextBox1,在Repeater里再放一个TextBox1,在母版页里再放一个,在用户控件里再放一个。你看到:同一页面里又可以存在多个TextBox1,为何?因为这些TextBox1位于不同的命名容器里,它们的UniqueID会自动加上前缀(除了在不是命名容器的Page里的控件)。FindControl方法是根据ID在当前命名容器范围内(或Page)的某个控件下递归地寻找控件,它寻找控件时不能进入另一个命名容器。哪些是命名容器呢?GridViewRow、DataListItem、RepeaterItem、用户控件、母版页等等。
      

  10.   

    同一页面里的控件ID是可以相同的,但UniqeID肯定是不同的。
    楼主的问题其实跟“命名容器”这个概念有关。比如Page下放一个文本框,ID为TextBox1,在GridView里再放一个TextBox1,在Repeater里再放一个TextBox1,在母版页里再放一个,在用户控件里再放一个。你看到:同一页面里又可以存在多个TextBox1,为何?因为这些TextBox1位于不同的命名容器里,它们的UniqueID会自动加上前缀(除了在不是命名容器的Page里的控件)。FindControl方法是根据ID在当前命名容器范围内(或Page)的某个控件下递归地寻找控件,它寻找控件时不能进入另一个命名容器。哪些是命名容器呢?GridViewRow、DataListItem、RepeaterItem、用户控件、母版页等等。
    寻找控件时会判断其是否实现了INamingContainer接口,如果是的话,就不进入它里面寻找。
      

  11.   

    http://topic.csdn.net/u/20111227/18/37a6a552-10c6-4807-9be2-937a6d444e4d.html?46300
    谢谢解答下个   帖子不能沉啊
    这个问题没解决 帖子不能沉啊问题是这样的 比如我通过post传递一个300字左右的文章 没问题但是传递500字的时候 SessionID这个唯一标识丢掉了
    比如按照上面的配置 cookieless="true"才行  但是缺点是出现SESSION在地址栏有没有其他办法可以解决问题谢谢了
      

  12.   

    同一页面里的控件ID是可以相同的,但UniqeID肯定是不同的。
    楼主的问题其实跟“命名容器”这个概念有关。比如Page下放一个文本框,ID为TextBox1,在GridView里再放一个TextBox1,在Repeater里再放一个TextBox1,在母版页里再放一个,在用户控件里再放一个。你看到:同一页面里又可以存在多个TextBox1,为何?因为这些TextBox1位于不同的命名容器里,它们的UniqueID会自动加上前缀(除了在不是命名容器的Page里的控件)。FindControl方法是根据ID在当前命名容器范围内(或Page)的某个控件下递归地寻找控件,它寻找控件时不能进入另一个命名容器。哪些是命名容器呢?GridViewRow、DataListItem、RepeaterItem、用户控件、母版页等等。
    寻找控件时会判断当前的容器控件其是否实现了INamingContainer接口,如果是的话,就不进入它里面寻找。
      

  13.   

    我给你一个提示。母板页在运行时不过就是内容页的一个用户控件,而用户控件是实现了 INameingContainer 既接口的。所以你从内容页执行FindCtrold是不可能去查找母板页内容的。这道理只要有过正规的培训,不用翻书就立刻想起来了。
      

  14.   

    我给你一个提示。母板页在运行时不过就是内容页的一个用户控件,而用户控件是实现了 INameingContainer 既接口的。所以你从内容页执行FindCtrold是不可能去查找母板页内容的。这道理只要有过正规的培训,不用翻书就立刻想起来了。
      

  15.   

    多谢楼上老大的热心指点,小弟最近因为手头上事比较多,所以没什么时间去找资料深入研究,就上来csdn问了,下个月忙完了,一定按照老大的指示去研究,话说最近asp版块人气不行啊