前言:对于Repeater控件,相信从事NETWeb开发的同仁们再熟悉不过了。因其呈现方式和Literal一样,并不在前端生成任何表单标签元素,所以属于比较轻量级的控件。不过青睐于Repeater的主要原因还是其表单布局的自由性和易控性。下面就来总结一下使用Repeater常用的功能:子控件的查找。

一、在ItemTemplateAlternatingItemTemplate中查找

这个估计大家应该都知道,不过这里还是要列一下,代码如下:

 RepeaterItemCollection ReItems = Repeater1.Items;
foreach (RepeaterItem item in ReItems)
{
Label lbl = (Label)item.FindControl("Label1");//以查找Label为例,下同
}

这里可能有人要说了,是不是需要加Repeater1.Items的类型判断,如下判断:

 if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
foreach (RepeaterItem item in ReItems)
{
Label lbl = (Label)item.FindControl("Label1");
}
}

在这我想说加判断没任何问题,但是不加也不会有问题,因为Repeater1.Items就是这两种类型(注意:如果是通过其他方式查找,则可能必须加此判断)。

二、在HeaderTemplateFooterTemplate中查找

根据上面提到的,通过Repeater1.Items集合肯定是找不到了,那怎么找呢?我们知道Repeater是数据控件,是可以包含子控件的,那么自然也就有Controls属性,没错,就是他。

在HeaderTemplate中找

 Label lbl = (Label)Repeater1.Controls[].Controls[].FindControl("Label1");

在FooterTemplate中找

 Label lbl2 = (Label)Repeater1.Controls[Repeater1.Controls.Count - ].Controls[].FindControl("Label1");

三、在SeparatorTemplate中查找

这个答案下面找

 RepeaterItem item; Label lbl; string msg="";
for (int cnt = Repeater1.Controls.Count, i = ; i < cnt; i++)
{
item = (RepeaterItem)Repeater1.Controls[i];
lbl = (Label)item.FindControl("Label1");
if (lbl == null) continue;
switch (item.ItemType)
{
case ListItemType.Header: msg = "Label在Header中"; break;
case ListItemType.Item: msg = "Label在Item" + i + "中"; break;
case ListItemType.AlternatingItem: msg = "Label在AlternatingItem " + i + "中"; break;
case ListItemType.Separator: msg = "Label在Separator" + i + "中"; break;
case ListItemType.Footer: msg = "Label在Footer中"; break;
default: break;
}
ScriptManager.RegisterStartupScript(this, this.GetType(), "" + i, "alert('" + msg + "');", true);
}

四、使用C#3.0的新的语言功能:扩展方法

说明:此处不为讲解扩展方法,直接上代码了,并且都配了详细的使用例子,如果有不懂得地方可以MSDN或google

1.扩展方法

说明:命名空间和类名根据实际需要自己定义

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.ComponentModel;
namespace SignUp.Web.App_Code
{
/// <summary>
/// 扩展方法
/// </summary>
public static class NetExtensionFunctions
{
/// <summary>
/// 查找控件下的后代控件
/// </summary>
/// <param name="ctrl"></param>
/// <returns></returns>
public static IEnumerable<Control> GetChildren(this Control ctrl)
{
var children = ctrl.Controls.Cast<Control>();
return children.SelectMany(GetChildren).Concat(children);
}
/// <summary>
/// 查找控件下指定类型的后代控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ctrl"></param>
/// <returns></returns>
public static List<T> FindControlsByType<T>(this Control ctrl)
{
return ctrl.GetChildren().OfType<T>().ToList<T>();
}
/// <summary>
/// 查找控件下符合Predicate条件的后代控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ctrl"></param>
/// <param name="where"></param>
/// <returns></returns>
public static List<T> FindControlsByType<T>(this Control ctrl, Predicate<T> where)
{
return ctrl.GetChildren().OfType<T>().ToList<T>().FindAll(where);
}
}
}

2.使用扩展方法

注意:必须在使用的地方引用扩展方法所在的命名空间

 using SignUp.Web.App_Code;

2.1使用GetChildren()扩展方法

 IEnumerable<Control> controls = Repeater1.GetChildren();
foreach (Control ctrl in controls)
{
if (ctrl is Label && ctrl.ID == "Label1")
{
ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('找到了Label1');", true);
break;
}
}

2.2使用扩展方法:FindControlsByType<T>(this Control ctrl)

 List<RepeaterItem> repeaterItems = Repeater1.FindControlsByType<RepeaterItem>();
foreach (RepeaterItem item in repeaterItems)
{
if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)
{
List<Label> Labels = item.FindControlsByType<Label>();
//do others...
}
}

2.3使用扩展方法:FindControlsByType<T>(this Control ctrl, Predicate<T> where)

 List<RepeaterItem> repeaterItems = Repeater1.FindControlsByType<RepeaterItem>(x => (x.ItemType == ListItemType.Item || x.ItemType == ListItemType.AlternatingItem));
foreach (RepeaterItem item in repeaterItems)
{
List<Label> Labels = item.FindControlsByType<Label>();
//do others...
}

总结:对于Repeater相信已是老生常谈,这里我想需要留意的应该是扩展方法的应用。虽然代码量不多,但知识点可不少。如要很熟练的编写和使用扩展方法,至少要熟悉Linq编程,对泛型有较深入的理解,还有对Lambda和Delegate熟练的应用等。最后希望本文对大家有所帮助。

补充纠错:在扩展方法3中,使用了C#上下文关键字Where作为参数名,确实不宜!(感谢alert(dong)在评论中的指出);另外这位朋友还指出扩展方法里没有对NULL进行控制,下面给出两个控制

1.如果为NULL返回空集合(使用中只怕会混淆)

  if (object.Equals(null, ctrl))
return new List<Control>().AsEnumerable<Control>();

2.如果为NULL抛出异常(略显多余,NET本就会引发异常)

  if (object.Equals(null, ctrl))
throw new ArgumentNullException("Control", "未将对象引用设置到对象实例");

3.启用Try Catch机制(还是抛出异常的好)

4.还请浏览过本贴的大侠,雁过留声,给予指点。

Repeater 模板中查找子控件的更多相关文章

  1. 初步探讨WPF的ListView控件(涉及模板、查找子控件) - GavinJun

    本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...

  2. 初步探讨WPF的ListView控件(涉及模板、查找子控件)

    本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...

  3. 【转】WPF查找子控件和父控件方法

    一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...

  4. WPF查找子控件和父控件方法

    一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...

  5. JS获取用户控件中的子控件Id

    用户控件 <asp:HiddenField ID="hfGradeId" runat="server" /> <asp:HiddenField ...

  6. Activity中获取当前Fragment 中的子控件

    XXXAdapter中 增加 public Fragment currentFragment; @Override public void setPrimaryItem(ViewGroup conta ...

  7. WPF 列表控件中的子控件上下文绑定

    <DataGrid Grid.ColumnSpan=" Height="Auto" SelectedItem="{Binding Path=SelectP ...

  8. pyqt5-复合控件中的子控件

    天子骄龙

  9. 【WPF】查找父/子控件(元素、节点)

    整理一下项目中常用的找控件功能,包括找父/子控件.找到所有同类型子控件(比如ListBox找到所有Item). using System; using System.Collections.Gener ...

随机推荐

  1. 面向对象三大特征之继承(extends)——Java笔记(六)

    继承:            从一般到特殊的关系,是一种拓展关系,子类对象是父类的一种,也可称为”is a“的关系 泛化:         把子类里的共性抽取到父类里的来的过程 特化:         ...

  2. javascript系列之this

    原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...

  3. 关联A850刷机包 高级电源 时间中心 优化 ROOT 动力 美化 简化

    ROM简介 1.合并app以及framewok框架apk 2.破解安卓核心验证 3.加入busybox指令集 4.加入Root权限 5.时间居中显示.通知图标不会重叠 6.加入网速显示 7.加入%1精 ...

  4. Activity的LaunchMode情景思考

    此链接:http://blog.csdn.net/xiaodongrush/article/details/28597855 1. 有哪几种类型?分别有什么用? http://developer.an ...

  5. Objective-c中的单例

    单例是指静态分配的实例,就是只开辟一块内存,不会重新开辟内存,而 iphone sdk 中全是这种实例,例如[UIApplication sharedApplication] 返回一个指向代表应用程序 ...

  6. css3中display和box小结

    display:table用处: 1.创建登高列 2.实现大小不确定元素的垂直居中 3.容器内子项目数目未知,子项目平均分配容器的水平空间 float必须指定其宽度才行,不确定的话就用display: ...

  7. 数据结构--画画--最小生成树(Prim算法)

    通信网络的最小生成树配置,它是使右侧的生成树值并最小化.经常使用Prim和Kruskal算法.看Prim算法:以防万一N={V,{E}}它是在通信网络,TE它是N设置边的最小生成树.从算法U={u0} ...

  8. shell 批量压缩指定文件夹及子文件夹内图片

    shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...

  9. C#验证IP地址

    using System.Net; try { IPAddress a = IPAddress.Parse(输入的IP字符串); } catch (System.Exception ex) { Mes ...

  10. C# 截取图片区域,并返回所截取的图片

    /// <summary> /// 截取图片区域,返回所截取的图片 /// </summary> /// <param name="SrcImage" ...