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

丨莫丨灬丨邪丨

丨莫丨灬丨邪丨

2016-02-19 13:08

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

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

(本文来源于图老师网站,更多请访问https://m.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://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
如何在组件(component中)模拟用户控件(UserControl)中FindForm()

如何在DataGrid控件中隐藏列

ASP
如何在DataGrid控件中隐藏列

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

如何在LINUX中HTTPD认证用户?

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
如何在LINUX中HTTPD认证用户?

如何在Excel工作表中插入控件

excel
如何在Excel工作表中插入控件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

关于2.0 中的用户控件编程使用

Web开发
关于2.0 中的用户控件编程使用

ASPX中的用户控件与ASP中的INCLUDE方法对比

Web开发
ASPX中的用户控件与ASP中的INCLUDE方法对比

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

win10正式版IE浏览器程序在哪里?

win10正式版IE浏览器程序在哪里?

JAVA起步环境的配置

JAVA起步环境的配置
下拉加载更多内容 ↓