如何在组件(component中)模拟用户控件(UserControl)中FindForm()

2016-02-19 13:08 0 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享如何在组件(component中)模拟用户控件(UserControl)中FindForm()的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】

 使用Component编程是一项值得推崇的技术,它既具有可视化的界面编程模式,又不向UserControl那样体积庞大。但是,熟悉UserControl的朋友们都知道,在UserControl类中有一个FindForm()函数,返回UserControl所在的窗体的引用,这将大大方便我们对窗体的控制----尽管这可能有些越俎代庖的味道,但有时我们就需要这种控制能力。
    但是,在Component并没有提供这样的函数,你可以使用其它的一些技巧来取得Component所在的窗体的引用,比如在Component的构造函数中使用Application.AddMessageFilter(this),然后取出由窗体发来的消息的句柄,就可以得到窗体的引用,缺点是不能设计时刻就获得窗体引用;比如可以给Component加一个StyleForm的属性,然后你就可以在设计器中用鼠标选择一个,缺点是你必须手动来选择。
     今天,花了半天的时间,终于设计出了克服了以上两个缺点的方案,代码如下:
 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)
using System;  using System.ComponentModel;  using System.Collections.Generic;  using System.Diagnostics;  using System.Text;  using System.ComponentModel.Design;  using System.Windows.Forms;  namespace FindFormSimulation  {      public partial class BaseStyle : Component      {          public BaseStyle()          {              InitializeComponent();                      }           public BaseStyle(IContainer container)          {              container.Add(this);               InitializeComponent();          }          /**//// summary          /// 关键在这里,对基类的Site重载。          /// /summary          public override ISite Site          {              get             {                  return base.Site;              }              set             {                  if (base.Site != value)                  {                      base.Site = value;                      //使用反射机制,在设计时刻取得你要控制的窗体。                      IReferenceService referenceService = (IReferenceService)this.GetService(typeof(IReferenceService));                      if (referenceService != null)                      {                          /**////下面这句用于取得本组件所在的窗体对象。                          object[] parent = referenceService.GetReferences(typeof(Form));                          Form container = parent[0] as Form;                          StyleForm = container;                          /**////如下方法测试,可以知道parent.Length总是为1的。                          //StyleForm.Text = parent.Length.ToString();                      }                  }              }          }          private Form styleForm = null;          [Description("本组件所要控制的窗体"), DefaultValue(null)]          public Form StyleForm          {              get { return styleForm; }              set             {                  if (styleForm != value)                  {                      styleForm = value;                  }              }          }      }  } 

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1603061.html

延伸阅读
标签: windows系统
如何在Windows8中更改用户账户类型   1、进入开始界面点击桌面; 2、在桌面左下角单击鼠标右键,打开控制面板; 3、然后点击用户账户和家庭安全; 4、点用户账户选项; 5、打开后选择更改账户类型选项; 6、单击打开更改账户类型; 7、选择管理员将标准用户权限改为管理员权限; 8、...
标签: word
如何在word中打钩?   我们在填写调查问卷的时候,常常会在我们意向的项目前面打勾,但是如果收到的调查问卷是一个word文档呢?问题就来了!如何在word中打钩?关于这个问题相信困扰了不少网友,下面就一起来了解一下在word中打钩的具体步骤吧,希望本教程对大家有所帮助! 如何在word中打钩? 选中需要打√的框框; ...
标签: 电脑入门
如何在word中打钩?如果你也遇到过这个问题,本文为你提供三种解决如何在word中打钩的方法。 第一种方法:利用输入法在Word中打钩。 无论你是QQ输入法还是搜狗输入法或智能ABC,都可以打钩和打叉。调出输入法,然后按键盘上的V,然后接着按1,然后翻页就可以找到钩和叉了。 QQ拼音中打钩 智能ABC打钩 第二种方法:利用Word中的符...
Visual Basic中的文本框控件允许用户在其中键入文本,以便在 程序中使用。相反, 程序员可能会希望显示一些文本但不希望用户编 辑该文本。本文介绍了如何创建只读的文本框控件的内容。 使一个文本框控件只读 在Visual Basic中,如果文本框控件的MultiLine属性设置为True ,文本将会自动地换行到下一行。另外,如果文本框控件的ScrollB...
本文对“组件”这个术语进行定义并提供特别是与组件编程相关的 .NET 框架编程概念的概述。虽然“组件”这个术语有多种含义,但在 .NET 框架中,组件是指实现 System.ComponentModel.IComponent 接口的一个类,或从实现该接口的类中直接或间接导出的类。 如果想要您的组件或控件在其他编程语言中可以使用,您必须以符合公共语言规范 (CLS) 的语...

经验教程

987

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部