【发帖带散300分】重量级地查询控件

以专业开发人员为伍 2009-05-31 05:32:08
好几个月没有发帖了,这次写一个简单的帖子,期望可以提高各位对asp.net等开发的兴趣。

在asp.net中,FindControl方法有其自己的含义,参见我在以前的一个帖子中的解释。

asp.net中使用FindControl有其严格的逻辑意义,超乎初学者的想象。过去我较多地去“纠正”对FindControl的认识问题,但是这种“错误”的理解如果要实现又该如何实现呢?我给出我在写自动化测试程序时使用的一个函数来演示这个遍历并查询控件的功能。

首先,你可以创建一个.cs文件,例如我就创建一个文件Extensions.cs。它的内容如下:
using System.Collections.Generic;
using System.Web.UI;

static public class Extensions
{
static public IEnumerable<T> Cast<T>(this Control ctrl) where T : Control
{
foreach (Control x in ctrl.Controls)
if (x is T)
yield return (T)x;

foreach (Control x in ctrl.Controls)
foreach (var r in Cast<T>(x))
yield return r;
}
}


这里使用.net3.0所具有的扩展方法技术为“任意”Control都增加了一个Cast<T>方法,这样就可以提供给Linq一个天然的数据集对象。

以上就是我们需要的所有技术!没有更多了。它可以遍历一个Control之下的所有子控件,不受INamingContainer接口限制。例如我们可以在某个页面中这样测试它:
    protected void Page_Load(object sender, EventArgs e)
{
var cs = from Button b in this.form1 where b.Text.StartsWith("B") select b;
Page.ClientScript.RegisterStartupScript(this.GetType(), "result", "alert('找到" + cs.Count().ToString() + "个符合条件的按钮。');", true);
}


(当然,不要忘记要using System.Linq命名空间)

通过一行代码,我们搜索到页面的Form下的所有以B字母打头的Button控件,并且在页面上显示出查询到的个数。

我在实际的asp.net程序中几乎从来不使用这种方法,因为使用FindControl就足够。我只是在自动化测试程序中使用,因为在程序不断开发过程中,控件设计是经常变化的,使用Linq可以用精炼的一行语句写出更清楚、用得更持久的代码,更加适合面对复杂的应用,例如自动化测试程序就是这样的应用。
...全文
1199 162 打赏 收藏 转发到动态 举报
写回复
用AI写文章
162 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-06-19
  • 打赏
  • 举报
回复
sp1234的写法总是用精美形容。
the art in your code.
ChargeForward 2009-07-01
  • 打赏
  • 举报
回复
您是我的宙斯
slowgrace 2009-06-04
  • 打赏
  • 举报
回复
感觉自动化测试程序要用到很多平常开发中用不到的“变态”功能,呵呵。
辉之不趣 2009-06-04
  • 打赏
  • 举报
回复
学习,接分
wjn161 2009-06-04
  • 打赏
  • 举报
回复
mark`
lonelySurvive 2009-06-04
  • 打赏
  • 举报
回复
mark
localboss 2009-06-04
  • 打赏
  • 举报
回复
学习,收藏
  • 打赏
  • 举报
回复
我们可以用c#写Cast<T>方法定义,然后用在vb.net网页中,例如我在帖子:
http://topic.csdn.net/u/20090603/15/527970d0-48f8-4c3a-88a9-2d55478717a2.html?seed=1598315317
中的两条代码所示。
q114515704 2009-06-03
  • 打赏
  • 举报
回复
顶 接分
itrefer 2009-06-03
  • 打赏
  • 举报
回复
学习
程序漫步 2009-06-03
  • 打赏
  • 举报
回复
学习~~~~
hnsdwhl 2009-06-03
  • 打赏
  • 举报
回复
学习
shenweiblue 2009-06-03
  • 打赏
  • 举报
回复
mark
cheeks 2009-06-03
  • 打赏
  • 举报
回复
学习了
SY_ToG 2009-06-03
  • 打赏
  • 举报
回复
学习
oec2003 2009-06-03
  • 打赏
  • 举报
回复
up
jdbcodbc 2009-06-03
  • 打赏
  • 举报
回复
mark
zjx0816 2009-06-03
  • 打赏
  • 举报
回复
学习学习~~
LYH_OHYES 2009-06-03
  • 打赏
  • 举报
回复
jf..
龙宜坡 2009-06-03
  • 打赏
  • 举报
回复
大侠回来看大家了
加载更多回复(138)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧