当前位置:编程学习 > C#/ASP.NET >>

细说FindControl

今天帮朋友解决一个问题ListView中怎么FindControl不到子控件。
直接调用ListView1.FindControl("idLable") 报个错未将对象实例内个错抱着好奇的心态我百度了下。大概有4种办法我就不说了。


 其中一种办法是


[csharp]  Response.Write(ListView1.FindControl("ListView1$ctrl0$idLabel")); 

Response.Write(ListView1.FindControl("ListView1$ctrl0$idLabel"));

主要问题是id变了。ID变成Control.UniqueID了。为什么会出现这种情况呢。

抱着好奇的心态我查了下msdn原来ListView实现了INamingContainer接口子控件的Control.UniqueID变成了父容器加子容器的形式了!难怪

Response.Write(ListView1.FindControl("ListView1$ctrl0$idLabel"))可以找到这个控件。现在看似问题解决了。可是还是有个问题

[csharp]  protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e) 
    { 
        //这里和Repeater稍有不同  
 
        if (e.Item.ItemType == ListViewItemType.DataItem) 
        { 
 
            Label txtName = (Label)e.Item.FindControl("idLable"); 
 
            txtName.Text = "我是ListView中被查找的子控件"; 
 
        } 
    } 

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        //这里和Repeater稍有不同

        if (e.Item.ItemType == ListViewItemType.DataItem)
        {

            Label txtName = (Label)e.Item.FindControl("idLable");

            txtName.Text = "我是ListView中被查找的子控件";

        }
    }

这个方法也能找到Lable不是说FindControl传的是Control.UniqueID么?这里传idLable怎么可以?经过我和狮虎仔细讨论之后终于得出了结论。

我们可以看e.Item的类型


[csharp]  namespace System.Web.UI.WebControls 

    // 摘要:  
    //     表示 System.Web.UI.WebControls.ListView 控件中的单个项。  
    [ToolboxItem(false)] 
    public class ListViewItem : Control, IDataItemContainer, INamingContainer 
    { 
        // 摘要:  
        //     初始化 System.Web.UI.WebControls.ListViewItem 类的新实例。  
        //  
        // 参数:  
        //   itemType:  
        //     System.Web.UI.WebControls.ListViewItemType 枚举值之一。  
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] 
        public ListViewItem(ListViewItemType itemType); 
 
        // 摘要:  
        //     获取或设置 System.Web.UI.WebControls.ListViewItem 对象绑定到的基础数据对象。  
        //  
        // 返回结果:  
        //     System.Web.UI.WebControls.ListViewItem 对象绑定到的基础数据对象。  
        public virtual object DataItem { get; set; } 
        //  
        // 摘要:  
        //     获取绑定到 System.Web.UI.WebControls.ListViewItem 控件的数据项的索引。  
        //  
        // 返回结果:  
        //     绑定到 System.Web.UI.WebControls.ListViewItem 控件的数据项的索引。  
        public virtual int DataItemIndex { get; } 
        //  
        // 摘要:  
        //     获取数据项在 System.Web.UI.WebControls.ListView 控件中显示的位置。  
        //  
        // 返回结果:  
        //     数据项在 System.Web.UI.WebControls.ListView 控件中显示的位置。  
        public virtual int DisplayIndex { get; } 
        //  
        // 摘要:  
        //     获取 System.Web.UI.WebControls.ListViewItem 对象的项类型。  
        //  
        // 返回结果:  
        //     System.Web.UI.WebControls.ListViewItemType 值之一。  
        public ListViewItemType ItemType { get; } 
 
        // 摘要:  
        //     确定是否将事件沿页面的 ASP.NET 服务器控件层次结构向上传递。  
        //  
        // 参数:  
        //   source:  
        //     事件源。  
        //  
        //   e:  
        //     事件数据。  
        //  
        // 返回结果:  
        //     如果事件已被取消,则为 true;否则为 false。  
        protected override bool OnBubbleEvent(object source, EventArgs e); 
    } 

namespace System.Web.UI.WebControls
{
    // 摘要:
    //     表示 System.Web.UI.WebControls.ListView 控件中的单个项。
    [ToolboxItem(false)]
    public class ListViewItem : Control, IDataItemContainer, INamingContainer
    {
   &

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,