2017-02-03 21 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.IntValue и value, так как она включает тип значения, и поэтому значение просто копируется, копия ссылки не копируется.

Для выполнения этой работы вы должны использовать созданный вами экземпляр значения, 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, который поднимет для вас событие, если оно обнаружит изменение (вам все равно нужно сделать некоторые работа над установщиком собственности, чтобы это действительно работало!).

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

Если вы хотите продолжить с событиями, которые достаточно легко получить идут, я, как правило, отрабатывают храм, который никогда не подводит меня:

общественное событие EventHandler ValueChanged;

, после чего значение изменилось, позвоните: ValueChanged? .Invoke (this, e); (новый синтаксис C# v6)

или использовать пользовательские события args для передачи нового значения слушателю: public event EventHandler ValueChanged;

затем позвоните: ValueChanged? .Invoke (это новый 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 - = new EventHandler (ValueHasChanged);

Поскольку они могут часто вызывать утечку памяти, если вы забудете !!!