asp.net findcontrol html控件,findcontrol-在ASP.NET中查找控件的更好方法
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中查找控件的更好方法相关推荐
- android include 控件详解,Android开发中include控件用法分析
本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...
- ASP.NET Repeater 头模板(HeaderTemplate)和FooterTemplate模板中查找控件
//在HeaderTemplate中寻找Label1,默认为第0个 string s=((Label)Repeater1.Controls[0].FindControl("Label1&qu ...
- matlab listbox选中输出,vba中ListBox控件的使用
给ListBox添加内容 If CheckBox8 = True Then---------------------------checkbox控件被选中 For i = 0 To ListBox1. ...
- [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
ASP.NET 主题和外观概述 主题是属性设置的集合,使用这些设置可以定义页面和控件的外观,然后在某个 Web 应用程中的所有页.整个 Web 应用程序或服务器上的所有 Web 应用程中一致地应用此外 ...
- ASP.Net2.0小技巧 保持滚动条的位置 焦点移动到某个控件 $符号轻松的使用FindControl...
您可能不知道的ASP.Net2.0小技巧 <!-- 页码和简介 --> 1. 在提交页面之后,保持滚动条的位置 可以在page指令上加上MaintainScrollPositionOnP ...
- [习题].FindControl()方法 与 PlaceHolder控件 #2(动态加入「子控件」的事件)
这是我的文章备份,有空请到我的网站走走, http://www.dotblogs.com.tw/mis2000lab/ 才能掌握我提供的第一手信息,谢谢您. http://www.dotblogs.c ...
- 当PreviousPage.FindControl遇到MasterPage,如何查找控件?
有以下两个页面Default.aspx和Result.aspx,代码如下: <!-- Default.aspx --> <%@ Page Language="C#" ...
- 学习笔记找到多个具有相同 ID“_header”的控件,FindControl 要求控件具有唯一的 ID....
解决 找到多个具有相同 ID"_header"的控件,FindControl 要求控件具有唯一的 ID. private void DisplayHotBooks() { ...
- [转] WinForm自定义函数FindControl实现按名称查找控件
原文地址 WinForm自定义函数FindControl实现按名称查找控件 本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值. ...
最新文章
- MIT CSAIL最新研究:将AI应用于流媒体视频,可获得更好的播放体验
- linux运维相关操作(centos/Ubuntu)
- hbuilderx能开发vue吗_学会就能接项目!Vue + Spring Boot 实现全栈商城项目开发
- soa面向服务体系结构_服务和面向微服务的体系结构简介
- 远程计算机用户端口,电脑怎么开远程端口
- linux多个svn仓库权限管理,svn建立仓库而且设置用户的权限
- 银监计算机类考试题库,干货!国考银监会财经类面试题库
- MySQL顺序读写和随机读写磁盘_随机读写与顺序读写的深入理解
- 隐藏终端和暴露终端浅析
- 爬虫-1-基础和urllib
- Google Chrome 浏览器最新版本 71.0.3578.98(正式版本) (64 位)
- SDN和NFV的主要区别
- 几分钟黑掉阿里,被马云500万年薪收编的黑客,现在混得咋样了?
- 未来已经降临,只是先后有别
- 试玩接入unity技巧
- 【数据库系统】规范化
- Windows10操作系统共享文件夹给VMWare虚拟机Ubuntu18.04操作系统使用
- 安卓sdk和ndk都是什么?
- 企业信息化建设中微服务架构选择的必要性
- 毕业设计 STM32智能路灯系统 - 物联网 嵌入式 单片机
热门文章
- 正则表达式,验证字符串由:中文、数字、英文、空格组成
- 案例:实现文件下载并能正确显示中文文件名
- html日期选择格式 now,JavaScript的Date.now()方法怎么用?
- 三维图形 纵坐标_《从柯氏四级培训效果评估到三维培训课程需求评估》
- java 日本时区_java时区时间ZoneOffset, ZoneId,OffsetTime,OffsetDateTi
- python从入门到_Python学习路线从入门到上手,如何快速Python学习?
- UI设计灵感|996打工人必备,日程计划网页设计
- 简约几何海报背景设计素材,可盐可甜
- 递归查找所有子代id php,PHP递归函数:从父ID获取子ID
- java知识点_JAVA面试必会知识点「mysql部分」