递归的妙用—遍历子控件

news/2024/7/4 23:10:30 标签: asp.net, button, object, 编程, web
我们在ASP.NET编程中, 经常需要遍历一个Web控件的子控件 ,找到所需的控件并获取控件中相应的值。以前我都是采用循环的方式遍历子控件,但当子控件是复杂的树形结构,比如:子控件也有子控件,子控件的子控件也有子控件。这时如果用循环的方式,就要用嵌套循环,而有时我们很难确定我们所要找的控件在子控件树的哪一层,昨天我就为些付出了代价,因为一个控件在内部增加了Panel控件,并将它的子控件移到了Panel控件上,我通过循环怎么也找不到所需的控件。
     既然子控件表现为一个树形结构,为什么我不用递归去遍历子控件?当我看着不太优雅的嵌套循环代码时,我突然这样想到。使用递归,根本不用关心所需的控件在哪一层,而且代码简洁。
     下面就是两种遍历方式:
1、循环方式:
for  ( int  i  = 0 ; i < GlobalCategoryPanel.Controls.Count;i ++ ) // GlobalCategoryPanel是个Panel控件
             {
                
if(GlobalCategoryPanel.Controls[i] is AdvancedPanel)//AdvancedPanel是个自定义控件
                {
                    AdvancedPanel ap
=(AdvancedPanel)GlobalCategoryPanel.Controls[i];
                    
for(int ap_i=0;ap_i<ap.Controls.Count;ap_i++)
                    
{
                        
if(ap.Controls[ap_i] is Panel)
                        
{
                            Panel ap_panel
=(Panel)ap.Controls[ap_i];
                            
for(int ap_panel_i=0;ap_panel_i<ap_panel.Controls.Count;ap_panel_i++)
                            
{
                                
if(ap_panel.Controls[ap_panel_i] is RadioButtonList)
                                
{
                                    RadioButtonList rbl
=(RadioButtonList)ap_panel.Controls[ap_panel_i];
                                    al.Add(
int.Parse(rbl.SelectedValue));
                                }

                                                
                            }

                        }

                    }

                }

            }

2、递归方式
private   void  Button1_Click( object  sender, System.EventArgs e)
        
{
            FindSelecedControl(GlobalCategoryPanel);
        }

        
private   void  FindSelecedControl(Control control) // 递归函数
         {
            
if(control is RadioButtonList)
            
{
                RadioButtonList rbl
=(RadioButtonList)control;
                al.Add(
int.Parse(rbl.SelectedValue));
            }

            
else
            
{
                
for(int i=0;i<control.Controls.Count;i++)
                
{
                    FindSelecedControl(control.Controls[i]);
                }

            }

        }
 
 

http://www.niftyadmin.cn/n/607854.html

相关文章

CentOS中root使用Vi不能高亮显示的解决办法以及TAB补全命令

想来大家都知道Vi其实使用的时候都是alias到vim的。所以在vim-enhanced这个包里面是支持高亮显示的。不说这么多废话了&#xff0c;如果想让root使用时候高亮显示&#xff0c;直接打vim就可以了。如果你想用vi的时候就需要简单修改一下配置文件。[kooklocalhost ~]$ rpm -qa | …

Acrobat Pro 集成升级包的方法

参考来源 http://www.cnprint.org/bbs/thread/77/111857/ Update Adobe Acrobat 9 Pro to v9.33[集成方法]http://5i01.com/topicdetail.php?f511&t1385904 Adobe Acrobat and Reader Updating and Deployment Information[升级顺序]http://kb2.adobe.com/cps/498/cpsid_4…

令人难忘的爱情电影10场经典对白

《河东狮吼》&#xff1a;“从现在开始&#xff0c;你只许疼我一个人&#xff0c;要宠我&#xff0c;不能骗我&#xff0c;答应我的每一件事都要做到&#xff0c;对我讲得每一句话都要真心&#xff0c;不许欺负我&#xff0c;骂我&#xff0c;要相信我&#xff0c;别人欺负我&a…

架构师(11月刊)

篇首语&#xff1a;银光渐远&#xff0c;孰之过&#xff1f; 最近社区里讨论的比较热烈的当属微软青睐HTML 5&#xff0c;而忽略自家产品Silverlight&#xff08;银光&#xff09;了&#xff0c;InfoQ中文站也对其做了深入报道&#xff0c;并引来评论无数。虽然随后微软主管服…

【pandas读入数据报错】OSError: Initializing from file failed

问题描述&#xff1a; pandas载入csv格式数据报错 B pd.read_csv("C:/Users/hp/Desktop/动手学数据分析/第一单元项目集合/train.csv") B.head(3)报错&#xff1a; OSError: Initializing from file failed原因分析&#xff1a; 调用pandas的read_csv()方法时&a…

visual studio安装问题【visual studio installer无法下载安装文件】

问题描述&#xff1a; visual studio installer无法下载安装文件 原因分析&#xff1a; 由于windows update&#xff08;windows系统更新服务被禁止&#xff09;&#xff0c;导致安装Visual Studio时也无法链接微软的地址源 解决方案&#xff1a; 找到Windows/system32/dr…

《PowerShell 350個活用範例:Windows 自動化技術大全》已在台湾上市

《PowerShell 350個活用範例&#xff1a;Windows 自動化技術大全》已在台灣上市&#xff0c;各大網路書店有售 書名&#xff1a;《PowerShell 350個活用範例: Windows自動化技術大全》 作者&#xff1a; 高陽、付海軍 ISBN&#xff1a; 9789862013847 出版社&#xff1a;博碩文…

torchvision.datasets.FashionMNIST报错[WinError 10054] 远程主机强迫关闭了一个现有的连接

项目场景&#xff1a; 在李沐老师视频课Softmax 回归 损失函数 图片分类数据集【动手学深度学习v2】中用到了FashionMNIST数据集。 问题描述&#xff1a; trans transforms.ToTensor() #下载到上一级目录的data文件中&#xff0c;下载的是训练数据集&#xff0c;类型时ten…