当我有一个类的多个实例时,如何获取该类的索引/事件?

时间:2018-11-09 23:32:44

标签: c# winforms class indexing

我有一个创建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(); 
    }
}

二等舱(J2):

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

1 个答案:

答案 0 :(得分:0)

正如我在评论解决方案中发布的那样,它在点击事件中使用了(sender as Label).Text

senderobject类型,其中包含触发事件的object

如果我们看一下如何使用此代码触发事件:

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

我们可以看到hanlder(this, e);正在传递this对象,该对象将触发它,而e作为一些参数(事件args)。

现在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");
    }
}