2012-04-03 11 views
2

私はwinformsで作業していますが、デザイナーに\ component \ usercontrolというフォームが表示されると、 app.configファイルから設定をロードするいくつかの静的イベントをリンクしようとしています。Winforms - デザイナーにフォームがロードされたときに関数を実行します。

私のプロジェクトで、「コントロールがロードされるといつでもこのイベントを実行する」というコードを定義できますか?

編集これは厳密にデザイン時のことです。

私はDLL "A"に基本形式を持っています。これには、「ColorLocation、SizeLocation」などの性質のものがあります。

DLL "B"には派生形式があります。 Bがデザイナーに読み込まれたとき、私はiEditorComponents(正確な名前を覚えていない)を持っていました。ユーザーは、現在のプロジェクトのapp.config設定ファイルで指定された巨大なリストからColorLocationを選択できます。

問題は、編集コンポーネントがベースであるDll "A"にあり、 "B"のapp.configにアクセスできないということです。

編集コンポーネントに「ねえ、この文字列のリストを使用して編集コントロールに入力する」ように指示する必要があります。デザイナーは、その派生クラスでコードを実行したくないと思われるすべてのことをやっています。

+2

これは良いとは言えません。設計時間は、実行時間から離れた世界です。 1つは、プロジェクトのapp.configファイルにアクセスする良い方法はありません。別の場合、イベントを聞くために周囲の誰かがゼロでなければならないというオッズがあります。 –

+0

あなたのユースケースをちょっと説明できますか?あなたが含まれているフォームがロードされているときにあなたのコンポーネントでいくつかのコードを実行したいということですか? –

+0

また、これはデザインタイムかランタイムタイムですか? –

答えて

3

はい、可能ですが、あなたがやっていることを確認してください。奇妙に聞こえるからです。

はあなたのForm'sまたはControl'sコンストラクタで次のコードを使用します。

public void Form1() 
    { 
     InitializeComponent(); 

     if (IsInWinFormsDesignMode()) 
     { 
      // your code stuff here 
     } 
    } 

    public static bool IsInWinFormsDesignMode() 
    { 
     bool returnValue = false; 

     #if DEBUG 

     if (System.ComponentModel.LicenseManager.UsageMode == 
      System.ComponentModel.LicenseUsageMode.Designtime) 
     { 
      returnValue = true; 
     } 

     #endif 

     return returnValue; 
    } 

はそれがお役に立てば幸いです。

+0

ロードイベントはデザイナーから発せられません。 –

+0

@Boo:そうです、答えを編集しました。ありがとう! –

1

これは特定のユースケースに当てはまるかどうかわかりませんが、ある時点ではコンポーネントのコンテナ(つまりフォーム)とやり取りする必要があったため、ErrorProviderのコードを "盗む" :

//code goes in your Component/Control 

private ContainerControl _containerControl = null; 

//Will contain a reference to the Form hosting this Component 
     public ContainerControl ContainerControl 
     { 
      get { return _containerControl; } 
      set { _containerControl = value; 
       //In here setup what you need from the Form 
       //for example add a handler 
       } 
     } 

     //Allows the VS.NET designer to set the ContainerControl 
     //in the designer code. Stolen from ErrorProvider. 
     public override ISite Site 
     { 
      set 
      { 
       base.Site = value; 
       if (value != null) 
       { 
        IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost; 
        if (host != null) 
        { 
         IComponent rootComponent = host.RootComponent; 
         if (rootComponent is ContainerControl) 
         { 
          this.ContainerControl = (ContainerControl)rootComponent; 
         } 
        } 
       } 
      } 
     } 

私はまた、デザイナーからの外部リソースと対話するStringConverter派生クラスを使用:

public class OpcDotNetTagConverter : StringConverter 
    { 
     #region Make It A ComboBox 
     public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
     { 
      return true; 
     } 
     public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
     { 
      return false; 
     } 
     #endregion 

     #region Display Tags In List 
     public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
     { 
      if ((context == null) || (context.Container == null)) 
      { 
       return null; 
      } 

      Object[] Tags = this.GetTagsFromServer(context); 
      if (Tags != null) 
      { 
       return new StandardValuesCollection(Tags); 
      } 
      return null; 
     } 

     private object[] GetTagsFromServer(ITypeDescriptorContext context) 
     { 
      List<string> availableTags = new List<string>(); 

      if (context.Instance == null) 
      { 
       availableTags.Add("ITypeDescriptorContext.Instance is null"); 
       return availableTags.ToArray(); 
      } 


      Interfaces.IOpcDotNetServerEnabled inst = context.Instance as Interfaces.IOpcDotNetServerEnabled; 
      if (inst == null) 
      { 
       availableTags.Add(context.Instance.ToString()); 
       return availableTags.ToArray(); 
      } 

      if (inst.OpcDotNetServer == null) 
      { 
       availableTags.Add("No server selected"); 
       return availableTags.ToArray(); 
      } 

      availableTags = inst.OpcDotNetServer.GetTagList(string.Empty); 
      availableTags.Sort(Comparer<string>.Default); 
      return availableTags.ToArray(); 
     } 

     #endregion 

     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 
      if(sourceType == typeof(string)) 
       return true; 
      return base.CanConvertFrom(context, sourceType); 
     } 

     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
     { 
      if (value is string) 
       return value.ToString(); 
      return base.ConvertFrom(context, culture, value); 
     } 

    } 

私は、これはいくつかの助けになることを願って。

乾杯

関連する問題