2017-02-06 3 views
1

私のアプリケーションには、約300の標準コントロールがいくつかの形式であるとしましょう。 いつか、すべてのコントロールに追加のメンバーを追加するとよいでしょう。アプリケーションのすべてのコントロールを遅く延期しますが、簡単に

何をする必要がありますか?私の考え方は次のとおりです。

はこのような基本クラスからControlの各タイプを派生さ:

public partial class MyButton : Button, MyInterface 
{ 
    ... 
} 

public partial class MyTextBox : TextBox, MyInterface 
{ 
    ... 
} 

public interface MyInterface 
{ 
    // Additional members 
    ... 
} 

これは

private MyButton myButton; 
private MyTextBox myTextBox; 

private System.Windows.Forms.Button myButton; 
private System.Windows.Forms.TextBox myTextBox; 

からそれを変更するには、すべて単一Controlに触れる意味します

および

this.myButton = new System.Windows.Forms.Button(); 
this.myTextBox = new System.Windows.Forms.TextBox(); 

this.myButton = new MyButton(); 
this.myTextBox = new MyTextBox(); 

への私の質問:簡単な方法はありますか?可能であれば、 Controlクラスを、 MyInterfaceからさらに派生したクラスに置き換えてください。 ( Control.Tagプロパティはオプションではありません)

+0

コントロールにどのようなプロパティを追加しようとしていますか? – Dispersia

+0

@分散:e。 g。リスト Pollitzer

+0

しかし、なぜあなたはこれらのコントロールを持っていたいのですか?コントロールはユーザーの入力用であり、データを含んではいけません。 – Dispersia

答えて

2

エクステンダープロバイダーの作成は、あなたにとっては良い選択です。 A ToolTipが例です。フォームにToolTipを追加すると、ToolTip on ToolTip1文字列プロパティがすべてのコントロールに追加されます。

エクステンダプロバイダは、他のコンポーネントにプロパティを提供します。エクステンダコンポーネントを設計して、異なる(単純または複雑な)タイプのプロパティを異なるコントロールタイプに追加することができます。エクステンダプロバイダによって提供されるプロパティは、実際にエクステンダプロバイダオブジェクト自体に存在するため、変更するコンポーネントの真のプロパティではありません。デザイン時に、プロパティがプロパティウィンドウに表示されます。実行時に、エクステンダコンポーネントのgetterメソッドとsetterメソッドを呼び出すことができます。ここで

リソース

は、文字列SomePropertyTextBoxButtonに追加する、とてもシンプルなサンプルコンポーネントです。このプロパティは実際の使用方法がない単純なものですが、それはあなたの出発点です。

using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
[ProvideProperty("SomeProperty", typeof(Control))] 
public class ControlExtender : Component, IExtenderProvider 
{ 
    private Hashtable somePropertyValues = new Hashtable(); 
    public bool CanExtend(object extendee) 
    { 
     return (extendee is TextBox || 
       extendee is Button); 
    } 
    public string GetSomeProperty(Control control) 
    { 
     if (somePropertyValues.ContainsKey(control)) 
      return (string)somePropertyValues[control]; 
     return null; 
    } 
    public void SetSomeProperty(Control control, string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
      somePropertyValues.Remove(control); 
     else 
      somePropertyValues[control] = value; 
    } 
} 
+0

Reza申し訳ありませんが、ここでコメントしてください、なぜ私の質問にあなたの答えはhttp://stackoverflow.com/q/42027926/68936削除されましたか?それはまさに私が望んでいたと思われ、私はそれをしようとしていた – Jimmy

+0

こんにちは@ジミー、問題ない、私はそれを復元しました。あなたが探しているものではありませんか?*、私はあなたに気にしないで、私の答えを取り除くことにしました。あなたはまたそれについてのフィードバックを送ることに興味がありません:) –

+0

良い解決策は、WPF [AttachedProperty](https://msdn.microsoft.com/en-us/library/system.activities.presentation)を私に思い出させます。 model.attachedproperty(v = vs.110).aspx); => [概要](https://msdn.microsoft.com/en-us/library/ms749011(v = vs.110).aspx) – Pollitzer

1

私はそれをしません。コントロールの通常の作業は変更されず、いくつかの余分な情報を保存するだけですか? MyExtensionクラスにMyInterfaceに追加されるすべてのメンバーが含まれているグローバルディクショナリを使用します。

1

メソッドを追加する場合は、単に拡張メソッドを使用します。

それ以外の場合は、汎用/特定の動作を定義するインターフェイス、これらのインターフェイスの汎用実装用の抽象クラス(従来のコントロールを継承するもの)、最後にこれらの抽象クラスから継承するクラスを作成することをお勧めします。しかし、あなたがそれを述べたように、あなたはそれをすべて名前を変更する必要があります。 (名前を変更したり、クラスに動的にメンバーを追加することはできませんが、私はアドバイスしません。

関連する問題