Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обработчик для массива объектов


Автор: neic 21.9.2010, 11:09
В общем, есть массив экземпляров
Код

QQ[] qqt = new QQ[10];


У объекта есть событие, допустим On.

Код

qqt[0] = new QQ();
qqt[0].on += new QQ.onEventHandler(qqt_on);


Код

//обработчик
private void qqt_on()
{
//код
}


Как мне узнать какой из экземпляров вызвал это событие? Т.е. если qqt[0], то вывести 0; если qqt[1], то вывести 1 и т.д.

Автор: CYBERDREAM 21.9.2010, 11:15
а какой делегат события у тебя?

Автор: neic 21.9.2010, 11:48
Код

public delegate void OnDelegate();

Автор: Kaerus 21.9.2010, 11:56
Используй делегат http://msdn.microsoft.com/ru-ru/library/system.eventhandler.aspx
Код

public delegate void EventHandler(
    Object sender,
    EventArgs e
)

а в sender передавай свои экземпляр

Автор: CYBERDREAM 21.9.2010, 12:06
Код

class Program
    {
        static void Main()
        {
            QQ[] massive = new QQ[] { new QQ("one"), new QQ("Two"), new QQ("art"), };
            foreach (QQ qq in massive)
                qq.On += qq_On;

            massive[2].Value = 1;

            massive[0].Title = "New title for the object";
            Console.ReadLine();

        }

        static void qq_On(object sender,EventArgs arg)
        {
            Console.WriteLine("Changed: " + sender);
        }

        

        internal class QQ
        {
            private string _title;
            public String Title
            {
                get { return _title; }
                set
                {
                    if (String.Compare(_title, value, StringComparison.CurrentCultureIgnoreCase) == 0) return;

                    _title = value;
                    RaiseObjectChanged();
                }
            }

            private double _value;
            public Double Value
            {
                get { return _value; }
                set
                {
                    if (value == _value)
                        return;

                    _value = value;
                    RaiseObjectChanged();
                }
            }


            public QQ(String title)
            {
                Title = title;
            }

            public override string ToString()
            {
                return Title;
            }

            public event EventHandler On;

            public void RaiseObjectChanged()
            {
                if (On != null)
                    On(this,new EventArgs());

            }
        }
    }

Автор: neic 21.9.2010, 12:11
А можно ли как-нибудь добиться этого результата, например:
Код

int index;
index = qqt.Select; //знаю что селект это не то, я хотел сказать которые сейчас выбран (вызван)


CYBERDREAM
Вся проблема, что я юзаю стороннюю .dll

И когда произойдет этот вызов я не знаю (т.е. событие вызывается не в программе, а в dll)

Вот приведу пример из VB6:

Код

Private Sub Command1_Click(Index As Integer)
MsgBox ("Была нажата кнопка № = " & Index)
End Sub


Что я хочу получить в C#:
Код

private void qqt_on(int index) //где index - индекс экземпляра
{
    MessageBox.Show(index);
    qqt[index].method();
}

Автор: CYBERDREAM 21.9.2010, 12:36
Цитата(neic @ 21.9.2010,  12:11)
А можно ли как-нибудь добиться этого результата, например:
Код

int index;
index = qqt.Select; //знаю что селект это не то, я хотел сказать которые сейчас выбран (вызван)


CYBERDREAM
Вся проблема, что я юзаю стороннюю .dll

И когда произойдет этот вызов я не знаю (т.е. событие вызывается не в программе, а в dll)

Вот приведу пример из VB6:

Код

Private Sub Command1_Click(Index As Integer)
MsgBox ("Была нажата кнопка № = " & Index)
End Sub


Что я хочу получить в C#:
Код

private void qqt_on(int index) //где index - индекс экземпляра
{
    MessageBox.Show(index);
    qqt[index].method();
}

на счет index = qqt.Select; не понял, что значит эта строка.
Если делегат события не имеет параметров, которые указывают на вызвавший объект, то даже не представляю как понять какой объект вызывал событие.

Автор: CYBERDREAM 21.9.2010, 13:34
Код

public delegate void QQConnectedHandler(MyQQ sender);

public class MyQQ:QQ
{
    public MyQQ()
    {
        onConnect += MyQQOnConnect;
    }

    void MyQQOnConnect()
    {
        if (OnConnectExtended != null)
            OnConnectExtended(this);
    }

    public event QQConnectedHandler OnConnectExtended;
}

{
    .................
    .................
    QQ[0].OnConnectExtended += new QQConnectedHandler(OnConnectExtended);
}
void OnConnectExtended(MyQQ sender)
{
    //вот ты и получил его;
}



Добавлено через 5 минут и 21 секунду
вот весь пример
Код

#region

using System;

#endregion

namespace delCON
{
    class Program
    {
        static void Main()
        {
            MyQQ[] massive = new[] { new MyQQ("one"), new MyQQ("Two"), new MyQQ("art"), };
            foreach (MyQQ qq in massive)
                qq.OnConnectExtended += qq_OnConnectExtended;

            massive[2].Value = 1;

            massive[0].Title = "New title for the object";
            Console.ReadLine();
        }

        static void qq_OnConnectExtended(MyQQ sender)
        {
            Console.WriteLine("Changed: " + sender);
        }


        internal class QQ
        {
            private string _title;
            public String Title
            {
                get { return _title; }
                set
                {
                    if (String.Compare(_title, value, StringComparison.CurrentCultureIgnoreCase) == 0) return;

                    _title = value;
                    RaiseObjectChanged();
                }
            }

            private double _value;
            public Double Value
            {
                get { return _value; }
                set
                {
                    if (value == _value)
                        return;

                    _value = value;
                    RaiseObjectChanged();
                }
            }


            public QQ(String title)
            {
                Title = title;
            }

            public override string ToString()
            {
                return Title;
            }

            public event QQConnectedHandler On;

            public void RaiseObjectChanged()
            {
                if (On != null)
                    On();

            }
        }

        public delegate void QQConnectedHandler();
        public delegate void MyQQConnectedHandler(MyQQ sender);

        public class MyQQ : QQ
        {
            public MyQQ(String title)
                :base(title)
            {
                On += MyQQ_On;
            }

            void MyQQ_On()
            {
                if (OnConnectExtended != null)
                    OnConnectExtended(this);
            }
            public event MyQQConnectedHandler OnConnectExtended;
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)