2017-02-03 7 views
-2

イベントを発生させることはできません。ここに私のコードです。 私が変える知りたい値は、このラインを持つ値であるということを教え:イベントの発生

eventvaluechange.IntValue = value;//link value as the value I want to see change 

値の変化が起こったとき、そして、私はそれが何をするか教えてください。

public partial class Form1 : Form 
{ 
    int value=0; 
    int value2=999; 
    Val_changeInt eventvaluechange; 
    public Form1() 
    { 
     InitializeComponent(); 
     eventvaluechange = new Val_changeInt(); 
     eventvaluechange.IntValue = value;//link value as the value I want to see change 
     eventvaluechange.ValueChanged += new EventHandler(ValueHasChanged);//what I do on event 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     value = value +1; 
    } 
    private void ValueHasChanged(object sender, EventArgs e) 
    { 
     value2 = value; 
     label1.Text = value2.ToString(); 
    } 
    class Val_changeInt 
    { 
     private int valueToWatchOn; 
     public event System.EventHandler ValueChanged; 
     protected object _lock = new object(); 
     protected virtual void ValueHasChanged() 
     { 
      EventHandler eventvaluechange = ValueChanged; 
      if (eventvaluechange != null) eventvaluechange(this, EventArgs.Empty); 
     } 
     public int IntValue 
     { 
      get { return this.valueToWatchOn; } 
      set 
      { 
       if (value != this.valueToWatchOn) 
       {//if value changed enter 
        this.valueToWatchOn = value; 
        ValueHasChanged(); 
       } 
      } 
     } 
    }//Event handler for a value change 

何が間違っていますか?

ありがとうございます。

+0

コードをステップバイステップでデバッグしようとしましたが、何が起こっているのを見ましたか? – Gusman

+0

デバッグヘルプ( "**なぜこのコードは動作しないのですか?**")には、目的の動作、特定の問題またはエラー、およびそれを再現するのに必要な最短コード**を質問**に含める必要があります。 **明確な問題文**のない質問は、他の読者には役に立たない。参照:[最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve) –

+0

はい、それは決してintvalueには入りません。 – Jablonovo

答えて

2

この:

eventvaluechange.IntValue = value;//link value as the value I want to see change 

は、あなたはそれがない何を考えていません。 eventvaluechange.IntValuevalueの間にはリンクがありません。これは値タイプが関係するため、値がコピーされただけで参照はコピーされません。

インスタンスを作成したバリューホルダーeventvaluechangeを使用する必要があります。このインスタンスには、値が変更されたときにイベントを発生させる値が保持されています。このように:

private void button1_Click(object sender, EventArgs e) 
{ 
    eventvaluechange.IntValue = eventvaluechange.IntValue + 1; 
} 
private void ValueHasChanged(object sender, EventArgs e) 
{ 
    value2 = eventvaluechange.IntValue; 
    label1.Text = value2.ToString(); 
} 
1

このコードでは、あまりにも多くのことが起こっているようです。

変化が単なる値であれば、攻撃計画を再検討して、INotifyPropertyChangedを実装してみてください。INotifyPropertyChangedは、変化を検出した場合にイベントを発生させます(まだこれが実際に機能するためには、プロパティの設定者で作業してください!)。

https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

あなたが軌道に乗るには十分簡単でイベントを継続したい場合は、私は私を失敗したことがない寺をオフに動作する傾向がある:

公開イベントのEventHandlerにValueChanged。

ここで値が変更された場所: ValueChanged?.Invoke(this、e); (新しいC#v6構文)

またはカスタムイベントargsを使用して、新しい値をリスナーに戻すことができます。 publicイベントEventHandler ValueChanged;

次に、 を呼び出します。ValueChanged?.Invoke(this、new ValueArgs(newValue));

ValueArgsは、そのように宣言されています

public class ValueArgs : EventArgs 
{ 
    public bool ValueUpdated { get; set; } 

    public ValueArgs() { } 
    public ValueArgs(int valueUpdated) 
    { 
     ValueUpdated = valueUpdated; 
    } 
} 

、あなたが今までにイベントを手動で割り当てた場合:

eventvaluechange.ValueChanged + =新しいEventHandlerの(ValueHasChanged)。

フォームが閉じられた/廃棄されたときに、割り当てを解除するのを忘れないでください!

eventvaluechange.ValueChanged - =新しいEventHandler(ValueHasChanged);

これらは、忘れてしまった場合、メモリリークを引き起こすことがあります。

関連する問題