findcontrol-在ASP.NET中查找控件的更好方法

我有一个复杂的asp.net表单,在一个表单中甚至有50到60个字段,例如FindControl(),在MultiView中我有GridView,在GridView中我有几个CheckBoxes。

目前,我正在使用FindControl()方法的链接并检索子ID。

现在,我的问题是,还有其他方法/解决方案可以在ASP.NET中找到嵌套控件。

8个解决方案

72 votes

如果您要寻找一种特定类型的控件,则可以使用像这样的递归循环-[http://weblogs.asp.net/eporter/archive/2007/02/24/asp-net-findcontrol-recursive-with-generics.aspx]

这是我制作的示例,该示例返回给定类型的所有控件

///

/// Finds all controls of type T stores them in FoundControls

///

///

private class ControlFinder where T : Control

{

private readonly List _foundControls = new List();

public IEnumerable FoundControls

{

get { return _foundControls; }

}

public void FindChildControlsRecursive(Control control)

{

foreach (Control childControl in control.Controls)

{

if (childControl.GetType() == typeof(T))

{

_foundControls.Add((T)childControl);

}

else

{

FindChildControlsRecursive(childControl);

}

}

}

}

jimmystormig answered 2020-06-26T12:12:06Z

18 votes

像往常一样晚。 如果仍然有人对此感兴趣,则有许多相关的SO问题和解答。 解决此问题的我的递归扩展方法版本:

public static IEnumerable FindControlsOfType(this Control parent)

where T : Control

{

foreach (Control child in parent.Controls)

{

if (child is T)

{

yield return (T)child;

}

else if (child.Controls.Count > 0)

{

foreach (T grandChild in child.FindControlsOfType())

{

yield return grandChild;

}

}

}

}

David Clarke answered 2020-06-26T12:12:26Z

9 votes

所有突出显示的解决方案都在使用递归(这会导致性能高昂)。 这是没有递归的更干净的方法:

public T GetControlByType(Control root, Func predicate = null) where T : Control

{

if (root == null) {

throw new ArgumentNullException("root");

}

var stack = new Stack(new Control[] { root });

while (stack.Count > 0) {

var control = stack.Pop();

T match = control as T;

if (match != null && (predicate == null || predicate(match))) {

return match;

}

foreach (Control childControl in control.Controls) {

stack.Push(childControl);

}

}

return default(T);

}

Ondrej Svejdar answered 2020-06-26T12:12:46Z

6 votes

FindControl不会在嵌套控件中进行递归搜索。 它只会找到您正在调用FindControl的NamigContainer控件。

原因有一个原因,默认情况下,ASP.Net不会递归查看嵌套控件:

性能

避免错误

可重用性

考虑到出于可重用性的原因,您想将GridView,Formview,UserControl等封装在其他UserControl中。 如果您将在页面中实现所有逻辑并使用递归循环访问这些控件,则将很难对其进行重构。 如果您已通过事件处理程序(例如GridView的RowDataBound)实现了逻辑和访问方法,则它将变得更加简单且不易出错。

Tim Schmelter answered 2020-06-26T12:13:29Z

1 votes

控件上的动作管理

在基类中创建以下类。类要获取所有控件,请执行以下操作:

public static class ControlExtensions

{

public static IEnumerable GetAllControlsOfType(this Control parent) where T : Control

{

var result = new List();

foreach (Control control in parent.Controls)

{

if (control is T)

{

result.Add((T)control);

}

if (control.HasControls())

{

result.AddRange(control.GetAllControlsOfType());

}

}

return result;

}

}

来自数据库:在DATASET(DTActions)中动态获取所有动作ID(如divAction1,divAction2 ....)是允许特定用户使用的。

在Aspx中:在HTML中,将div(或跨度)中的Action(按钮,锚点等)放到div或span中,并给它们id

Submit

在CS中:在页面上使用此功能:

private void ShowHideActions()

{

var controls = Page.GetAllControlsOfType();

foreach (DataRow dr in DTActions.Rows)

{

foreach (Control cont in controls)

{

if (cont.ClientID == "divAction" + dr["ActionID"].ToString())

{

cont.Visible = true;

}

}

}

}

atif answered 2020-06-26T12:14:06Z

1 votes

递归查找与指定谓词匹配的所有控件(不包括根控件):

public static IEnumerable FindControlsRecursive(this Control control, Func predicate)

{

var results = new List();

foreach (Control child in control.Controls)

{

if (predicate(child))

{

results.Add(child);

}

results.AddRange(child.FindControlsRecursive(predicate));

}

return results;

}

用法:

myControl.FindControlsRecursive(c => c.ID == "findThisID");

DavidWainwright answered 2020-06-26T12:14:31Z

1 votes

我决定只建立控件字典。 较难维护,可能比递归FindControl()运行得更快。

protected void Page_Load(object sender, EventArgs e)

{

this.BuildControlDics();

}

private void BuildControlDics()

{

_Divs = new Dictionary();

_Divs.Add(MyEnum.One, this.divOne);

_Divs.Add(MyEnum.Two, this.divTwo);

_Divs.Add(MyEnum.Three, this.divThree);

}

在我不回答OP的问题之前不屑一顾...

问:现在,我的问题是,还有其他方法/解决方案可以在ASP.NET中找到嵌套控件吗?答:是的,避免首先搜索它们。 为什么要搜索您已经知道的东西? 最好构建一个允许引用已知对象的系统。

B H answered 2020-06-26T12:15:00Z

0 votes

下面的示例定义一个Button1_Click事件处理程序。 调用此处理程序时,此处理程序使用FindControl方法在包含页面上找到具有TextBox2的ID属性的控件。 如果找到该控件,则使用Parent属性确定其父级,并将该父级控件的ID写入页面。 如果找不到TextBox2,则将“找不到控件”写入页面。

private void Button1_Click(object sender, EventArgs MyEventArgs)

{

// Find control on page.

Control myControl1 = FindControl("TextBox2");

if(myControl1!=null)

{

// Get control's parent.

Control myControl2 = myControl1.Parent;

Response.Write("Parent of the text box is : " + myControl2.ID);

}

else

{

Response.Write("Control not found");

}

}

Sudhakar Rao answered 2020-06-26T12:15:20Z

asp.net findcontrol html控件,findcontrol-在ASP.NET中查找控件的更好方法相关推荐

  1. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  2. ASP.NET Repeater 头模板(HeaderTemplate)和FooterTemplate模板中查找控件

    //在HeaderTemplate中寻找Label1,默认为第0个 string s=((Label)Repeater1.Controls[0].FindControl("Label1&qu ...

  3. matlab listbox选中输出,vba中ListBox控件的使用

    给ListBox添加内容 If CheckBox8 = True Then---------------------------checkbox控件被选中 For i = 0 To ListBox1. ...

  4. [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述

    ASP.NET 主题和外观概述 主题是属性设置的集合,使用这些设置可以定义页面和控件的外观,然后在某个 Web 应用程中的所有页.整个 Web 应用程序或服务器上的所有 Web 应用程中一致地应用此外 ...

  5. ASP.Net2.0小技巧 保持滚动条的位置 焦点移动到某个控件 $符号轻松的使用FindControl...

    您可能不知道的ASP.Net2.0小技巧 <!-- 页码和简介 --> 1.  在提交页面之后,保持滚动条的位置 可以在page指令上加上MaintainScrollPositionOnP ...

  6. [习题].FindControl()方法 与 PlaceHolder控件 #2(动态加入「子控件」的事件)

    这是我的文章备份,有空请到我的网站走走, http://www.dotblogs.com.tw/mis2000lab/ 才能掌握我提供的第一手信息,谢谢您. http://www.dotblogs.c ...

  7. 当PreviousPage.FindControl遇到MasterPage,如何查找控件?

    有以下两个页面Default.aspx和Result.aspx,代码如下: <!-- Default.aspx --> <%@ Page Language="C#" ...

  8. 学习笔记找到多个具有相同 ID“_header”的控件,FindControl 要求控件具有唯一的 ID....

    解决 找到多个具有相同 ID"_header"的控件,FindControl 要求控件具有唯一的 ID. private void DisplayHotBooks()     { ...

  9. [转] WinForm自定义函数FindControl实现按名称查找控件

    原文地址 WinForm自定义函数FindControl实现按名称查找控件 本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值. ...

最新文章

  1. MIT CSAIL最新研究:将AI应用于流媒体视频,可获得更好的播放体验
  2. linux运维相关操作(centos/Ubuntu)
  3. hbuilderx能开发vue吗_学会就能接项目!Vue + Spring Boot 实现全栈商城项目开发
  4. soa面向服务体系结构_服务和面向微服务的体系结构简介
  5. 远程计算机用户端口,电脑怎么开远程端口
  6. linux多个svn仓库权限管理,svn建立仓库而且设置用户的权限
  7. 银监计算机类考试题库,干货!国考银监会财经类面试题库
  8. MySQL顺序读写和随机读写磁盘_随机读写与顺序读写的深入理解
  9. 隐藏终端和暴露终端浅析
  10. 爬虫-1-基础和urllib
  11. Google Chrome 浏览器最新版本 71.0.3578.98(正式版本) (64 位)
  12. SDN和NFV的主要区别
  13. 几分钟黑掉阿里,被马云500万年薪收编的黑客,现在混得咋样了?
  14. 未来已经降临,只是先后有别
  15. 试玩接入unity技巧
  16. 【数据库系统】规范化
  17. Windows10操作系统共享文件夹给VMWare虚拟机Ubuntu18.04操作系统使用
  18. 安卓sdk和ndk都是什么?
  19. 企业信息化建设中微服务架构选择的必要性
  20. 毕业设计 STM32智能路灯系统 - 物联网 嵌入式 单片机

热门文章

  1. 正则表达式,验证字符串由:中文、数字、英文、空格组成
  2. 案例:实现文件下载并能正确显示中文文件名
  3. html日期选择格式 now,JavaScript的Date.now()方法怎么用?
  4. 三维图形 纵坐标_《从柯氏四级培训效果评估到三维培训课程需求评估》
  5. java 日本时区_java时区时间ZoneOffset, ZoneId,OffsetTime,OffsetDateTi
  6. python从入门到_Python学习路线从入门到上手,如何快速Python学习?
  7. UI设计灵感|996打工人必备,日程计划网页设计
  8. 简约几何海报背景设计素材,可盐可甜
  9. 递归查找所有子代id php,PHP递归函数:从父ID获取子ID
  10. java知识点_JAVA面试必会知识点「mysql部分」