2017-09-17 8 views
1

NameComponentに実装したいと思います。これは、コンポーネントを指しているフォームのフィールド名と同じ値を持ちます。С#WinForms。コンポーネント内の "Name"プロパティの実装

private MyComponent myComponent1; 
this.myComponent1.Name = "myComponent1"; 

のWinFormsはすでにControlクラスでこのようなプロパティを実装、私はそれがどのように動作するかを理解することはできません。

private System.Windows.Forms.Button button1; 
this.button1.Name = "button1"; 

MyComponentDesignerでプライベート文字列Nameプロパティを宣言することについて考えます。 またはIComponentChangeServiceサービスでComponentRenameイベントを使用します。 WinFormsのソースコードを調べても、正確な説明はありません。

答えて

1

プロパティグリッドに表示される単純なNameプロパティを必要とする場合は、コンポーネントに簡単な自動取得セットNameプロパティを追加すれば十分です。あなたのコンポーネントをしたい場合でも、Name性質を持っているとコントロールの(Name)財産などの(Name)財産行為はNameプロパティをこのように追加します。

string name; 
[Browsable(false)] 
public string Name 
{ 
    get 
    { 
     if (Site != null) 
      name = Site.Name; 
     return name; 
    } 
    set 
    { 
     if (Site != null) 
      Site.Name = value; 
     name = value; 
    } 
} 

この方法では、あなたが得るまたはコードを使用してNameプロパティを設定、またはプロパティで可能にグリッド。プロパティグリッドでは、(Name)に値を割り当てるとNameプロパティが割り当てられ、デザイナーもコンポーネント名の割り当てを生成します。

+0

ありがとうReza。 期待どおりに動作します。 プロパティ名は、myComponentを指すフィールドの名前によって割り当てられます。 しかし、これがなぜ機能するのか、それが説明されているリンクを教えてください。 私にとっては魔法のように見えます。 devenv.exeをデバッグしてNames.Setメソッドをデバッグしようとしました。しかし、Names.Setは設計時に呼ばれることはないようです。 – DmitryB

+0

あなたは歓迎です:) Windowsフォームの実装は、 'Control'、' Name'プロパティの 'Name'プロパティと' ControlDesigner'の 'PrefilterProperties'メソッドに基づいています。私は全体のパターンを実装しようとはしませんでしたが、私にとってはより簡単な実装を提供しようとしました。私の実装では、private 'name'フィールドは、実行時にコンポーネントの名前を持ちます(コンストラクタにコンテナを渡さずに' Component'を作成する場合)。また、 'Site.Name'を設定することで、' Control'クラスがこの振る舞いを持つのと同じように、設計時に必要な動作を実現します。 –

+0

それはもっとはっきりしましたが、完全ではありませんでした。 主な作業は、Name.getメソッドで行われます。 VSがコード のNameメソッドを実装し、Nameプロパティから値を取得すると、 デザインタイムサイトに! = nullの場合、コード名= Site.Nameが機能します。 Site.Nameは、コンポーネントを指すフィールドの実際のプロパティ名です。 その結果、コードが書き込まれます this.myComponent1.Name = VS.myComponent1.Name.get(return Site.Name)= "myComponent1"; – DmitryB

関連する問題