簡體   English   中英

觸發事件

[英]Firing an event

我無法觸發事件。 這是我的代碼。 我告訴它我想知道改變的價值是價值這一行:

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

我究竟做錯了什么??

非常感謝。

這個:

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();
}

該代碼似乎有點太多了!

如果它只是一個正在改變的值,你可能應該重新考慮你的攻擊計划並考慮實現 INotifyPropertyChanged,如果它檢測到一個變化,它會為你引發一個事件(你仍然需要在 setter 上做一些工作屬性的實際工作!)。

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

如果你想繼續參加那些很容易開始的活動,我傾向於在一座永遠不會讓我失望的寺廟里工作:

公共事件 EventHandler ValueChanged;

然后在值改變的地方,調用: ValueChanged?.Invoke(this, e); (新的 C# v6 語法)

或者使用自定義事件參數將新值傳遞回偵聽器: public event 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 += new EventHandler(ValueHasChanged);

然后不要忘記在關閉/處理表單時取消分配它!

eventvaluechange.ValueChanged -= new EventHandler(ValueHasChanged);

因為如果你忘記了,這些通常會導致內存泄漏!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM