前言:对于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. 挑逗B少年搞计划10 假设你是愿意用我的心脏层剥离一层~

        这些天都非常推迟考试啊.然后,学校已安排一周培训,是的.在延迟学习,大狼医院我真的是正常水平.     幸好我们周六周日不让放假了,不然预计进度直接就停了.这两天也是抽出了时间把敲了一下三层的 ...

  2. MSMQ-发送消息到远程专用队列 实例

    目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子   一. ...

  3. 写手Remoting测试工具

    基于.NET开发分布式系统.经经常使用到Remoting技术.在測试驱动开发流行的今天.假设针对分布式系统中的每一个Remoting接口的每一个方法都要写具体的測试脚本,无疑很浪费时间.所以,我想写一 ...

  4. java保存获取Web内容的文件

    package com.mkyong;   import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...

  5. jquery 访问控制菜单

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpqOTExOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  6. 关闭safari浏览器button默认样式

    前两天又遇到一个头疼的问题,在Chrome上调试好的样式,去到手机上打开,傻了... 这是什么鬼... 搜了一下,才知道这是appearance属性搞的鬼.. . 比方你想让一个div拥有button ...

  7. oracle_删除同一列的重复数据

    <!--删除同一列的重复数据 rowid 在orcle中 数据的物理地址---> delete from tbl_over_picture_alarm a where rowid not ...

  8. Mac+PhpStorm+XAMPP+Xdebug

    Mac+PhpStorm+XAMPP+Xdebug 环境的配置   在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体验,非常简略的介绍和对比了几款常用的集成开 ...

  9. 从WebBrowser中取得Cookie 和 WebClient设置cookie!

    原文:从WebBrowser中取得Cookie 和 WebClient设置cookie! 从WebBrowser中取得Cookie 的代码 CookieContainer myCookieContai ...

  10. SQL 无限级分类语句

    原文:SQL 无限级分类语句 原表数据为: 此处用到了with关键字,在程序中也可以用递归实现,但觉得还是没有一条sql方便 with tb (ID,Name,ParentID,Sort) as( s ...