2009-04-24 13 views
1

C#3.5のWinforms ...IExtenderProviderとWinFormsのデザイナーのファイル

は、だから私は最近IExtenderProviderを発見したのだが、追加のプロパティを持つコントロールを拡張するために使用することができますか。

私が設定したプロトタイププロジェクトでは、extendeeプロパティの 'set'メソッドにブレークポイントを設定しました。フォームがロードされると、フォーム上のすべてのコントロールに対して 'set'メソッドが実行されていました。それはまさに私が望んでいたものです。プロトタイプが成功した後、私はメインプロジェクトにエクステンダコンポーネントを実装しました。私のプロジェクトのすべてのフォームは、エクステンダコンポーネントを追加したベースフォームから継承しています。ベースフォームでは、エクステンダコンポーネントの修飾子をpublicに設定して、このベースフォームを継承するフォームでアクセスできるようにしました。

私のextendeeプロパティの 'set'メソッドでブレークポイントを追加する前に同じことをしていますが、フォーム内のコントロール(ただし、ベースフォームのコントロールのみ)ではメソッドが実行されません。助けて!

この時点で私は自分のフォームを制御しているので、そのほとんどがチェックインされている(つまり、変更からロックされている)ということを追加するべきでしょう。私がチェックアウトしてプロバイダプロパティを変更したフォームについては、私はデザイナーのファイルで、すべてのコントロールにプロバイダプロパティの 'set'メソッドを呼び出す追加のステートメントがあることに気付きました。

this.MyProvider1.SetMyProperty(this.txtTextBox1、false);

エクステンダコンポーネントを動作させるには、デザイナファイルを物理的に変更する必要がありますか、ロックされたファイルに対処できなければならないと思います。私はそれがデザイナーのファイルを変更する必要がある場合は、新しいフォームやエクステンダコンポーネントがプロジェクトに追加された後に変更されるフォームの問題ではないと思う - しかし、101フォームがすべてソースでロックされている-safe ...

私は、任意の考えをいただければと思います...どの時点で

答えて

1

エクステンダープロバイダ(IExtenderProvider)があること(私の場合のWinFormsコントロールで)「タイプ」を拡張しませんエクステンダーは意図されていた。設計時または実行時に?

デザイナーはIExtenderProviderインタフェース

からプロパティエディタ
方法bool CanExtend(object)であなたのエクステンダーの性質を示すために責任があるアムI権利のためにそれを考え中エクステンダコンポーネントを動作させるには、デザイナファイルを物理的に変更する必要があります。また、ロックされたファイルに対処できなければならないため、setメソッドを動的に呼び出す必要がありますか?

それは、私はそれがデザイナーのファイルを変更する必要がないならば、これがために問題はありません推測する物理的デザイナーのファイルを変更し、そこに拡張プロパティ

を書くことがあります新しいフォームやフォームは、エクステンダコンポーネントがプロジェクトに追加された後に変更されますが、ソースセーフで101個のフォームがロックされていると問題になります...

これは、新しいフォームの問題ではありません、そして古いフォームためされていません。
拡張プロパティを設定する場合は、古いフォームを開き、拡張プロパティを設定します(ファイルをチェックアウトする必要があります)。

0

これは本当に私の疑惑を確認します。しかしこれは、古いフォームに何らかの物理的な変更が加えられた場合にのみコンポーネントが拡張されるという点で問題を残しています。

コンポーネントにイベントハンドラを追加したり削除したりするために、Setプロパティメソッドをハイジャックしようとしていました(コンポーネントがコントロールの場合)。 Imageプロパティはブール値です。falseに設定すると、イベントハンドルが追加され、デフォルトの動作が追加されます(trueに設定するとイベントハンドラは追加されません)

新しく追加されたコントロール追加されたフォームには、明示的にプロパティをfalseに設定してもイベントハンドラが自動的に追加されますが、古いフォームのデザイナファイルは変更されないため、イベントハンドラは追加されません。いくつかの背景として

、私は Global event handler for all controls for User Help

すべてのコントロールのためのグローバルイベントハンドラを追加しようとしていたここでのテーマは、私のフォームにコンテキストヘルプを追加することで、ここでエクステンダーの例です(イベントハンドラを一部として追加されますエンド初期化子)

パブリックパーシャルクラスは、HelpProviderの:コンポーネント、IExtenderProvider、ISupportInitialize

...省略エクステンダーの他のコード...

#region ISupportInitialize Members 

    public void BeginInit() 
    { 
     // do nothing 
    } 

    public void EndInit() 
    { 
     if (DesignMode) 
      return; 

     foreach (Component item in _disableOnlineHelp) 
     { 
      if (item == null) 
       continue; 

      if (GetDisableOnlineHelp(item)) // developer has decide to set property to TRUE 
       continue; 

      Control control = item as Control; 

      if (control != null) 
       continue; 

      control.HelpRequested += new HelpEventHandler(HelpProvider_HelpRequested); 
      _toolTip.SetToolTip(control, GetHelpText(control)); 
     } 
    } 

    #endregion 

    #region DisableOnlineHelp Provider Property 

    public virtual bool GetDisableOnlineHelp(Component component) 
    { 
     object flag = _disableOnlineHelp[component]; 

     if (flag == null) 
      return false; 

     return (bool)flag; 
    } 

    public virtual void SetDisableOnlineHelp(Component component, bool value) 
    { 
     _disableOnlineHelp[component] = value; 
    } 

    #endregion 
0

1つの問題は、EndInit方法でforeachループかもしれません:

Control control = item as Control; 

if (control != null) 
    continue; 

項目は、実際には、コントロールである場合、あなたはこのコードを実行する前に、ループから抜け出す:

control.HelpRequested += new HelpEventHandle(HelpProvider_HelpRequested); 
_toolTip.SetToolTip(control, GetHelpText(control)); 

イベントハンドラまたはツールヒントをコントロールに追加しないでください。おっと:

ありがとう、 ジョン

関連する問題