细说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# ,