Как я могу получить индекс / событие класса, когда у меня есть несколько экземпляров этого класса? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть класс, который создает Label и отображает текст.
У меня также есть событие Click, когда оно срабатывает, текст Label изменяется.

У меня есть другой класс, который передает метод первому, который показывает MessageBox.
В основном Form я запускаю цикл for, который создает 2 экземпляра класса в случайных местах.

Проблема в том, что когда я нажимаю Label, текст не меняется на Label, который я хочу. Он изменяется на первый Label (класс), созданный.

Как я могу это изменить?

class J1
{
    public Label texto;
    public static int a = 0;

    //Calls the Method that Creates the Label
    public void Spawn(Form form, int _X, int _Y)
    {
        LL(form, _X, _Y);
    }

    //Creates the label
    public void LL(Form form, int _X, int _Y) 
    {
        texto = new Label()
        {
            Size = new System.Drawing.Size(35, 50),
            Left = _X,
            Top = _Y,
            Text = "nova label"
        };
        texto.Click += new EventHandler(Label_Clicada);
        form.Controls.Add(texto);
    }

    void Label_Clicada(object sender, EventArgs e) //Click event when fires
    {
        J2.M(); //2nd Class that shows a MessageBox
        //Changes Text, but doenst change the one that was clicked on
        texto.Text = texto.GetType().ToString(); 
    }
}

2-й класс (J2):

class J2
{
    public static void M()//Method that I pass to 1nd class(J1)
    {
        J1.a++;
        MessageBox.Show(J1.a.ToString());
    }
}

1 Ответ

0 голосов
/ 13 ноября 2018

Поскольку я отправил в комментарии решение для этого, использовало (sender as Label).Text в событии щелчка.

sender - это тип object, который содержит object, который вызвал событие.

Если мы посмотрим, как события запускаются с этим кодом:

EventHandler<ThresholdReachedEventArgs> handler = ThresholdReached;
if (handler != null)
{
    handler(this, e);
}

Мы можем видеть, что hanlder(this, e); передает this объект, который его запускает, и e как некоторые параметры (аргументы события).

Теперь this / object, что переданное событие может быть любым объектом, если вы связываете несколько объектов с одним и тем же событием.

Например, если вы используете yourButton.Click += ClickEvent; и yourLabel.Click += ClickEvent, обе кнопки внутри имеют код выше, но обе они будут проходить разные this (themselves) и e (events if there are any)

поэтому внутри нашего мероприятия мы можем сделать это:

private void ClickEvent(object sender, EventArgs e)
{
    if(sender is Label)
    {
        Label l = sender as Label;
        //Do anything with label
    }
    else if(sender is Button)
    {
        Button b = sender as Button;
        //Do anything with button
    }
    else
    {
        MessageBox.Show("Unknown component");
        //Or
        throw new Exception("Unknown component");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...