Как проверить, нажата ли динамически созданная метка (событие MouseClick), и изменить ее цвета? - PullRequest
0 голосов
/ 14 мая 2019

Если честно, я не думаю, что в моем коде должен быть большой беспорядок / проблема, но почему-то цвета не меняются, когда я нажимаю на ярлык! То, чего я пытался достичь, было, если пользователь mouseClick male затем меняет цвет на зеленый, а другой ярлык aka (Female) снова становится красным, и наоборот!

                for (int i = 0; i < 2; i++)
                {
                Label RB = new Label();
                RB.Location = new Point(x,y);
                RB.Width = 95;
                RB.Text = LabelsText[4].Split('-')[i];
                RB.BackColor = Color.PaleVioletRed;
                RB.TextAlign = ContentAlignment.MiddleCenter;
                RB.Font = new Font(family.Families[0], 11.0f, FontStyle.Bold);
                RB.ForeColor = Color.AntiqueWhite;
                RB.Name = txtBoxNames[4].Split('-')[i];
                RB.MouseClick += (s, ev) =>
                {
                    if (((Label)(s)).Name == "isMale")
                    {
                        ((Label)(s)).BackColor = Color.GreenYellow;
                        ((Label)(s)).ForeColor = Color.Black;

                        foreach (Control ct in this.Controls)
                        {
                            if (ct is Label)
                            {
                                if (((Label)(ct)).Name == "isFemale")
                                {
                                    ((Label)(s)).BackColor = Color.PaleVioletRed;
                                    ((Label)(s)).ForeColor = Color.AntiqueWhite;
                                }
                            }
                        }
                        this.Refresh();
                        this.Update();
                    }
                    else if(((Label)(s)).Name == "isFemale")
                    {
                        ((Label)(s)).BackColor = Color.GreenYellow;
                        ((Label)(s)).ForeColor = Color.Black;

                        foreach (Control ct in this.Controls)
                        {
                            if (ct is Label)
                            {
                                if (((Label)(ct)).Name == "isMale")
                                {
                                    ((Label)(s)).BackColor = Color.PaleVioletRed;
                                    ((Label)(s)).ForeColor = Color.AntiqueWhite;
                                }
                            }
                        }
                    }
                };
                this.Controls.Add(RB);
                x += RB.Width + 10 ;
            }

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Поскольку вы добавляете два элемента управления в коллекцию this.Controls, вы можете получить доступ к другому полу , используя его имя: this.Controls["ButtonName"]:

Вы также можете разыграть object s до Control, чтобы упростить синтаксис:

var lbl = (s as Control);

Еще несколько сокращений здесь и там.


for (int i = 0; i < 2; i++)
{
    Label label = new Label();
    label.Width = 95;
    label.Location = new Point(x + (i * label.Width) + (i * 10), y);
    label.BackColor = Color.PaleVioletRed;
    label.ForeColor = Color.AntiqueWhite;
    label.TextAlign = ContentAlignment.MiddleCenter;
    label.Name = "isMale-isFemale".Split('-')[i];
    label.Text = label.Name;
    label.MouseClick += (s, ev) =>
    {
        var lbl = (s as Control);
        string other = lbl.Name.Equals("isFemale") ? "isMale" : "isFemale";
        lbl.BackColor = Color.GreenYellow;
        lbl.ForeColor = Color.Black;
        var ctl = this.Controls[other];
        if (ctl != null)
        {
            ctl.BackColor = Color.PaleVioletRed;
            ctl.ForeColor = Color.AntiqueWhite;
        }
    };
    this.Controls.Add(label);
}
1 голос
/ 14 мая 2019

В ваших циклах for-each вы изменяете элемент управления «отправитель» обратно на PaleVioletRed вместо метки, которую вы нашли:

Изменить это:

if (((Label)(ct)).Name == "isFemale") {
  ((Label)(s)).BackColor = Color.PaleVioletRed;
  ((Label)(s)).ForeColor = Color.AntiqueWhite;
}

к этому:

if (((Label)(ct)).Name == "isFemale") {
  ((Label)(ct)).BackColor = Color.PaleVioletRed;
  ((Label)(ct)).ForeColor = Color.AntiqueWhite;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...