2016-08-16 10 views
1

C#でカスタムのユーザーコントロールを作成しましたが、コントロール用のカスタムTextプロパティを追加しました。しかし、私のText Propertyの値が変更されたときでも、私はそれをTextChangedと呼んでいます。ここで UserControlのカスタムTextプロパティのカスタムTextChangedイベントハンドラ?

は、私は私のユーザーコントロールのために作成されたプロパティのために私のコードです:あなたは、私はすでに TextChangedイベントハンドラを作成しましたが、私はに Textプロパティにリンクする方法がわからない見たよう

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TestControls 
{ 
    public partial class Box: UserControl 
    { 
     public Box() 
     { 
      InitializeComponent(); 
     } 

     [Bindable(true)] 
     [EditorBrowsable(EditorBrowsableState.Always)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [Browsable(true)] 
     [Category("Appearance")] 
     public override string Text { get { return base.Text; } set { base.Text = value; this.Invalidate(); } } 

     [Browsable(true)] 
     public event EventHandler TextChanged; 
    } 
} 

'Text'の値が変更されたときにイベントが発生する場所にします。

私はWindowsフォームを使用していますが、私はWPFを使用していないので、WPFを必要とするものは何もしたくないことに注意してください。私がこの問題のために見つけたすべての解決策は、WPFと関係があります。または、文字列のイベントハンドラを作成しようとしていないため、私の問題を完全には解決できません。私は他の人がこれをどう管理しているか理解していませんが、どのようにして知りたいのですか。ありがとう。

答えて

2

Textプロパティの設定でイベントハンドラデリゲートを手動で呼び出す必要があります。

public partial class Box : UserControl 
{ 
    public Box() 
    { 
     InitializeComponent(); 
    } 

    [Bindable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    [Browsable(true)] 
    [Category("Appearance")] 
    public override string Text 
    { 
     get { return base.Text; } 
     set 
     { 
      if (base.Text != value) 
      { 
       base.Text = value; this.Invalidate(); 
       if(TextChanged != null) 
        TextChanged(this, EventArgs.Empty) 
      } 
     } 
    } 

    [Browsable(true)] 
    public event EventHandler TextChanged; 
} 
+0

あなたはちょうど私を手伝ったか分かりません。どうもありがとうございます。 –

+1

'TextChanged'イベントを処理したいだけなら、何もする必要はありません。' UserControl'クラスは正しく動作する 'TextChanged'を持っています。しかし、 'Text'プロパティのようにブラウズすることはできません。ブラウズ可能にする場合は、カスタムイベントアクセサ(イベントプロパティ)を使用することもできます。 –

2

あなただけTextChangedイベントを処理したい場合、あなたは何もする必要はありません、UserControlクラスが正しく動作TextChangedを持っています。しかし、そのTextプロパティのようにブラウズすることはできません。見てみましょう構文の詳細については

[Browsable(true)] 
public event EventHandler TextChanged 
{ 
    add { base.TextChanged += value; } 
    remove { base.TextChanged -= value; } 
} 

:あなたはそれが閲覧可能なようにしたい場合は

することは、他の回答に代わるものとして、あなたはこのようカスタムイベントアクセサ(イベントプロパティ)を使用することができますこのMSDNのリソース:

+0

また、 'Text'プロパティをカスタマイズする際には、setterで' this.Invalidate(); 'を呼び出すのではなく、' OnTextChanged'オーバーライドに入れるのがよいでしょう。 –

関連する問題