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

一、在ItemTemplateAlternatingItemTemplate中查找

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

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

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

  1. if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
  2. {
  3. foreach (RepeaterItem item in ReItems)
  4. {
  5. Label lbl = (Label)item.FindControl("Label1");
  6. }
  7. }

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

二、在HeaderTemplateFooterTemplate中查找

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

在HeaderTemplate中找

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

在FooterTemplate中找

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

三、在SeparatorTemplate中查找

这个答案下面找

  1. RepeaterItem item; Label lbl; string msg="";
  2. for (int cnt = Repeater1.Controls.Count, i = ; i < cnt; i++)
  3. {
  4. item = (RepeaterItem)Repeater1.Controls[i];
  5. lbl = (Label)item.FindControl("Label1");
  6. if (lbl == null) continue;
  7. switch (item.ItemType)
  8. {
  9. case ListItemType.Header: msg = "Label在Header中"; break;
  10. case ListItemType.Item: msg = "Label在Item" + i + "中"; break;
  11. case ListItemType.AlternatingItem: msg = "Label在AlternatingItem " + i + "中"; break;
  12. case ListItemType.Separator: msg = "Label在Separator" + i + "中"; break;
  13. case ListItemType.Footer: msg = "Label在Footer中"; break;
  14. default: break;
  15. }
  16. ScriptManager.RegisterStartupScript(this, this.GetType(), "" + i, "alert('" + msg + "');", true);
  17. }

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

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

1.扩展方法

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

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web;
  6. using System.Web.UI;
  7. using System.ComponentModel;
  8. namespace SignUp.Web.App_Code
  9. {
  10. /// <summary>
  11. /// 扩展方法
  12. /// </summary>
  13. public static class NetExtensionFunctions
  14. {
  15. /// <summary>
  16. /// 查找控件下的后代控件
  17. /// </summary>
  18. /// <param name="ctrl"></param>
  19. /// <returns></returns>
  20. public static IEnumerable<Control> GetChildren(this Control ctrl)
  21. {
  22. var children = ctrl.Controls.Cast<Control>();
  23. return children.SelectMany(GetChildren).Concat(children);
  24. }
  25. /// <summary>
  26. /// 查找控件下指定类型的后代控件
  27. /// </summary>
  28. /// <typeparam name="T"></typeparam>
  29. /// <param name="ctrl"></param>
  30. /// <returns></returns>
  31. public static List<T> FindControlsByType<T>(this Control ctrl)
  32. {
  33. return ctrl.GetChildren().OfType<T>().ToList<T>();
  34. }
  35. /// <summary>
  36. /// 查找控件下符合Predicate条件的后代控件
  37. /// </summary>
  38. /// <typeparam name="T"></typeparam>
  39. /// <param name="ctrl"></param>
  40. /// <param name="where"></param>
  41. /// <returns></returns>
  42. public static List<T> FindControlsByType<T>(this Control ctrl, Predicate<T> where)
  43. {
  44. return ctrl.GetChildren().OfType<T>().ToList<T>().FindAll(where);
  45. }
  46. }
  47. }

2.使用扩展方法

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

  1. using SignUp.Web.App_Code;

2.1使用GetChildren()扩展方法

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

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

  1. List<RepeaterItem> repeaterItems = Repeater1.FindControlsByType<RepeaterItem>();
  2. foreach (RepeaterItem item in repeaterItems)
  3. {
  4. if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)
  5. {
  6. List<Label> Labels = item.FindControlsByType<Label>();
  7. //do others...
  8. }
  9. }

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

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

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

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

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

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

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

  1. if (object.Equals(null, ctrl))
  2. 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. 我的Linux学习历程:那些我看过的Linux书籍们

    [+]查看原图http://www.ituring.com.cn/article/119401 来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位.有时茫 ...

  2. linux后台server开发环境的部署配置和验证(nginx+apache+php-fpm+FASTCGI(C/C++))

    linux后台server开发环境部署配置 引言 背景 随着互联网业务的不断增多.开发环境变得越来越复杂,为了便于统一server端的开发部署环境,特制定本配置文档. 使用软件 CentOS 6.3( ...

  3. hardware_hp刀片服务器安装windows 2008系统配置

    2012年10月26日星期五 第一步. 看刀片机柜的后的OA地址 点击 OK 查看 Actlve OA 例如: 192.168.254.31 l 第二步: 连接PC 到左侧第一个接口 修改本机ip为同 ...

  4. 【转】Android 常用 adb 命令总结

    原文地址:http://testerhome.com/topics/2565 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Andr ...

  5. 【云图】如何制作全国KTV查询系统?

    原文:[云图]如何制作全国KTV查询系统? 摘要:本文以[唱吧]531麦霸音乐节为案例,详细解读了如何导入自有数据到高德云图,并进行检索和展示.最后,调起高德mobile地图来进行路线规划和周边查询. ...

  6. C# Parse和Convert的区别分析(转)

    大家都知道在进行类型转换的时候有连个方法供我们使用就是Convert.to和*.Parse,但是疑问就是什么时候用C 什么时候用P 通俗的解释大家都知道: Convert 用来转换继承自object类 ...

  7. 认识bash这个shell

    我们通过shell将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作bash是我们Linux默认的shell 用户界面(Shell,application)--------核心(Kern ...

  8. 【动态规划】leetcode - Maximal Square

    称号: Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square contain ...

  9. 互联网点对点通讯(P2P)

    摘自: http://www.cnblogs.com/zhili/archive/2012/09/14/p2p_pnpr.html 很遗憾,目前看了下代码,我测试只是做到了本地p2p. [C# 网络编 ...

  10. HDU 1385 Minimum Transport Cost 最短路径题解

    本题就是使用Floyd算法求全部路径的最短路径,并且须要保存路径,并且更进一步须要依照字典顺序输出结果. 还是有一定难度的. Floyd有一种非常巧妙的记录数据的方法,大多都是使用这种方法记录数据的. ...