2017-02-03 2 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

, 나는 나에게 결코 실패하지 않는다 사원 오프 작동하는 경향이 :

공개 이벤트 핸들러의 valueChanged을;

값이 변경된 곳에서 다음 번호로 전화하십시오. ValueChanged? .Invoke (this, e); (새 C# v6 구문)

또는 사용자 지정 이벤트 args를 사용하여 새 값을 다시 수신기로 전달합니다. public 이벤트 EventHandler ValueChanged;

다음 호출 : ValueChanged? .Invoke (this, new ValueArgs (newValue));

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

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

을하고 당신이 이제까지 수동으로 이벤트 할당하는 경우 :

ValueArgs이 같은 선언

eventvaluechange.ValueChanged + = 새로운 이벤트 핸들러 (ValueHasChanged를);

그런 다음 양식을 폐쇄/폐기 할 때 지정 해제를 잊지 마세요!

eventvaluechange.ValueChanged - = new EventHandler (ValueHasChanged);

잊어 버리면 이러한 메모리 누수가 발생할 수 있습니다.