WinForm控件查找奇思

简介:

  最近做WinForm程序,尽搞些动态生成控件的,每次寻找某个空间时总要一大堆代码,简单但是写的多,烦啊。突然想起了Linq里的表达式方式,但是项目用的类库是2.0的。最后仿照Linq用范型写了一个遍历类:减少了一大堆不必要的代码。

代码很简单,就不用解释了,直接贴↑。

 


 
 
  1. public delegate bool SearchHandler(Control ctrFind);  
  2.     public class WinSearch<T>  
  3.     {  
  4. //ctr:查找起点控件。  
  5.         public static T Search(Control ctr, SearchHandler handler)  
  6.         {  
  7.             if (handler == null)  
  8.                 throw new Exception("Handler must be not null");  
  9.             if (ctr == null)  
  10.                 throw new Exception("Parent Control must be not null");  
  11.             if (!(ctr is Control))  
  12.                 throw new Exception("The fist parameter must be innert from Control");  
  13.             return SearchProxy(ctr, handler);  
  14.         }  
  15.  
  16.         protected static T SearchProxy(Control ctr,SearchHandler handler)  
  17.         {  
  18.             if (ctr.Controls.Count < 1)  
  19.             {  
  20.                 return default(T);  
  21.             }  
  22.             else 
  23.             {  
  24.                 foreach (Control child in ctr.Controls)  
  25.                 {  
  26.                     if (child is T  && handler(child))//注意返回范型类型应是如此才会返回。  
  27.                     {  
  28.                         return (T)(object)child;  
  29.                     }  
  30.                     else 
  31.                     {  
  32.                         foreach (Control ch in child.Controls)  
  33.                         {  
  34.                             object obj = SearchProxy(ch, handler);  
  35.                             if (obj !=null)  
  36.                             {  
  37.                                 return (T)obj;  
  38.                             }  
  39.                         }  
  40.                     }  
  41.                 }  
  42.                 return default(T);  
  43.             }  
  44.         }  
  45.          
  46.               
  47.     }  
  48.     
  49. 测试体:  
  50.    
  51.  private void button1_Click(object sender, EventArgs e)  
  52.         {  
  53.             Button btn = WinSearch<Button>.Search(this, new SearchHandler(mehtod));  
  54.             if (btn != null)  
  55.             {  
  56.                 MessageBox.Show(btn.Text);  
  57.             }  
  58.         }  
  59.         public bool mehtod(Control ctr)  
  60.         {  
  61.             if (ctr.Text =="button2")  
  62.                 return true;  
  63.             return false;  
  64.         }  




 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/833551,如需转载请自行联系原作者

相关文章
|
C#
27【C#】WinForm中如何获取一个控件相对于主界面的位置
使用button控件的 PointToScreen 方法和Form控件的 PointToClient 方法来获取button1相对于Form边界的位置。具体步骤如下:
248 0
一个控件几行代码实现换肤(可支持菜单)
这是从vbAccelerator(http://vbaccelerator.com)的皮肤程序修改而来,把DLL方式修改为OCX,并且修改为仅通过几行指令,即可完成皮肤加载。
514 0
|
算法
分页控件和几个相关控件的源代码
分页控件的源代码,可能会让有些人失望,因为代码很乱。乱的一个原因呢,可能是没有采用OO的思路吧,因为写控件的时候还一点都不会OO呢,只是一直在用,也就没有作大的重构。有两个分页控件, 一个是通过PostBack来分页的,一个是通过URL来分页的。
795 0
|
Web App开发
艾伟:WinForm控件开发总结(三)------认识WinForm控件常用的Attribute
在前面的文章里我们制作了一个非常简单的控件。现在我们回过头来看看这些代码透露出什么信息。   这个类是直接从Control类派生出来的,自定义控件都是直接从Control类派生出来的。这个类定义了一个属性TextAlignment,用来控制文本在控件中显示的位置:           ...
1018 0
|
Android开发
UWP 查找模板中的控件
原文:UWP 查找模板中的控件 这个标题我也不知道咋起,意思说一下你就明白。 1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI 比如ListView,GridView等。 2.
811 0
|
C#
WPF中获得控件相对于控件的相对位置
原文:WPF中获得控件相对于控件的相对位置 GeneralTransform generalTransform = lstitem.TransformToAncestor(this.BackStack); Point point = generalTransform.
938 0
|
C#
WPF查找子控件和父控件方法
原文:WPF查找子控件和父控件方法 public List GetChildObjects(DependencyObject obj, string name) where T : FrameworkElement { Dependen...
1416 0
|
存储 开发框架 .NET