Событие нажатия с несколькими переключателями - PullRequest
0 голосов
/ 01 августа 2020

кто-нибудь знает, почему этот код не работает?

код должен получить всех пользователей в списке и сделать для них радиокнопку, а затем с каждым щелчком он будет брать текст внутри списка в каждом пользовательский класс и добавьте их в текстовое поле

, но дело в том, что он работает только для последнего добавленного радиокнопки, а не для всех из них idk, почему.

 private void UserMessages()
    {
        int y = 8;
        int x = 7;
        
        if (TheClients.Count > 0)
        {
            foreach (HandleClients C1 in TheClients)
            {
                RB = new RadioButton();
                RB.Text = C1.ClientUser;
                RB.Location = new Point(x, y);
                RB.Font = PL_UsersCont.Font;
                RB.Visible = true;
                RB.AutoSize = true;
                RB.ForeColor = Color.Black;
                RB.FlatStyle = FlatStyle.Flat;
                PL_UsersCont.Controls.Add(RB);
                y += RB.Height;
            }
            RB.Click += RB_Click;
        }

    }

private void RB_Click(object sender, EventArgs e)
    {
        foreach (HandleClients MSGS in TheClients)
        {
            if (RB.Text == MSGS.ClientUser)
            {
                TXB_MSGS.Text = string.Empty;
                foreach (string M in MSGS.ClientMessages)
                {
                    TXB_MSGS.Text += M + "\r\n";
                }
            }
        }   
    }

1 Ответ

0 голосов
/ 01 августа 2020

Я вижу две проблемы в коде. Первый - с назначением обработчика событию Click. Чтобы исправить это, вам нужно переместить строку

RB.Click += RB_Click;

внутрь foreach l oop. В его нынешнем виде ваш код добавляет обработчик событий только для последнего созданного RadioButton, а не для каждого из созданных вами.

Во-вторых, вы также обнаружите проблему в RB_Click обработчике событий . Чтобы убедиться, что выбранный RadioButton обновлен, добавьте эту строку кода в foreach l oop:

RB.Tag = C1;

, а затем измените обработчик RB_Click на:

private void RB_Click(object sender, EventArgs e)
{
    RadioButton thisRadioButton = sender as RadioButton;

    if (thisRadioButton != null)
    {
        HandleClients MSGS = thisRadioButton.Tag as HandleClients;
        TXB_MSGS.Text = string.Empty;

        TXB_MSGS.Text += String.Join (Environment.NewLine, MSGS.ClientMessages);
    }   
}

Этот код теперь будет работать только с RadioButton, по которому щелкнули.

...