Как отправить собственное сообщение о событии сразу после создания элемента управления? - PullRequest
2 голосов
/ 07 декабря 2010

У меня пустая исключительная ошибка при отправке события ValueChanged () при создании этого пользовательского элемента управления и его тестировании в клиенте:

Источник пользовательского элемента управления:

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

namespace customevent
{
    [DefaultEvent("ValueChanged")]
    public partial class UserControl1 : UserControl
    {
        private int m_value;

        public delegate void ValueChangedHandler();
        [Category("Action")]
        [Description("Value changed.")]
        public event ValueChangedHandler ValueChanged;

        public int Value
        {
            get { return m_value; }
            set { 
                m_value = value;
                ValueChanged();
            }
        }

        public UserControl1()
        {
            InitializeComponent();
        }
        public UserControl1(int iValue)
        {
            this.Value = iValue;
            InitializeComponent();
        }

    }
}

Затем в тестовой форме:

    private void Form1_Load(object sender, EventArgs e)
    {
       userControl11.Value = 100;
    }

    private void userControl11_ValueChanged()
    {
        MessageBox.Show(userControl11.Value.ToString());
    }

Или вместо form_load сделать это в конструкторе:

    private void InitializeComponent()
    {
        this.userControl11 = new customevent.UserControl1(100);

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

Вы должны объявить обработку события следующим образом:

public event EventHandler ValueChanged;

protected virtual void OnValueChanged(object sender, EventArgs e)
{
    if (ValueChanged != null)
    {
       ValueChanged(sender, e);
    }
}

public int Value
{
    get { return m_value; }
    set { 
        if (m_value == value) return;
        m_value = value;
        OnValueChanged(this, EventArgs.Empty);
    }
}

PS: есть интерфейс INotifyPropertyChanged, вы должны использовать его вместо этого для соответствия стандартным правилам привязки данных .NET.

2 голосов
/ 07 декабря 2010

Вы не проверяете наличие нулей:

    public int Value
    {
        get { return m_value; }
        set { 
            m_value = value;
            if(ValueChanged != null)
            {
               ValueChanged();
            }
        }
    }

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

private void Form1_Load(object sender, EventArgs e)
{
   userControl1.ValueChanged += userControl11_ValueChanged;
   userControl11.Value = 100;
}

private void userControl11_ValueChanged()
{
    MessageBox.Show(userControl11.Value.ToString());
}
1 голос
/ 07 декабря 2010

Саймон почти до тебя дошел:

protected virtual void OnValueChanged(object sender, EventArgs e)
{
    var tmp = ValueChanged;
    if (tmp != null)
    {
       tmp(sender, e); // With the tmp, we won't explode if a subscriber changes the collection of delegates underneath us.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...