程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 如何在組件(component中)模擬用戶控件(UserControl)中FindForm()

如何在組件(component中)模擬用戶控件(UserControl)中FindForm()

編輯:C#基礎知識

 使用Component編程是一項值得推崇的技術,它既具有可視化的界面編程模式,又不向UserControl那樣體積龐大。但是,熟悉UserControl的朋友們都知道,在UserControl類中有一個FindForm()函數,返回UserControl所在的窗體的引用,這將大大方便我們對窗體的控制----盡管這可能有些越俎代庖的味道,但有時我們就需要這種控制能力。
    但是,在Component並沒有提供這樣的函數,你可以使用其它的一些技巧來取得Component所在的窗體的引用,比如在Component的構造函數中使用Application.AddMessageFilter(this),然後取出由窗體發來的消息的句柄,就可以得到窗體的引用,缺點是不能設計時刻就獲得窗體引用;比如可以給Component加一個StyleForm的屬性,然後你就可以在設計器中用鼠標選擇一個,缺點是你必須手動來選擇。
     今天,花了半天的時間,終於設計出了克服了以上兩個缺點的方案,代碼如下:
 

  1. using System;  
  2. using System.ComponentModel;  
  3. using System.Collections.Generic;  
  4. using System.Diagnostics;  
  5. using System.Text;  
  6. using System.ComponentModel.Design;  
  7. using System.Windows.Forms;  
  8. namespace FindFormSimulation  
  9. {  
  10.     public partial class BaseStyle : Component  
  11.     {  
  12.         public BaseStyle()  
  13.         {  
  14.             InitializeComponent();              
  15.         }  
  16.  
  17.         public BaseStyle(IContainer container)  
  18.         {  
  19.             container.Add(this);  
  20.  
  21.             InitializeComponent();  
  22.         }  
  23.         /**//// <summary>  
  24.         /// 關鍵在這裡,對基類的Site重載。  
  25.         /// </summary>  
  26.         public override ISite Site  
  27.         {  
  28.             get 
  29.             {  
  30.                 return base.Site;  
  31.             }  
  32.             set 
  33.             {  
  34.                 if (base.Site != value)  
  35.                 {  
  36.                     base.Site = value;  
  37.                     //使用反射機制,在設計時刻取得你要控制的窗體。  
  38.                     IReferenceService referenceService = (IReferenceService)this.GetService(typeof(IReferenceService));  
  39.                     if (referenceService != null)  
  40.                     {  
  41.                         /**////下面這句用於取得本組件所在的窗體對象。  
  42.                         object[] parent = referenceService.GetReferences(typeof(Form));  
  43.                         Form container = parent[0] as Form;  
  44.                         StyleForm = container;  
  45.                         /**////如下方法測試,可以知道parent.Length總是為1的。  
  46.                         //StyleForm.Text = parent.Length.ToString();  
  47.                     }  
  48.                 }  
  49.             }  
  50.         }  
  51.         private Form styleForm = null;  
  52.         [Description("本組件所要控制的窗體"), DefaultValue(null)]  
  53.         public Form StyleForm  
  54.         {  
  55.             get { return styleForm; }  
  56.             set 
  57.             {  
  58.                 if (styleForm != value)  
  59.                 {  
  60.                     styleForm = value;  
  61.                 }  
  62.             }  
  63.         }  
  64.     }  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved