【问题标题】:Multi radiobutton Click Event多单选按钮点击事件
【发布时间】:2020-08-01 15:43:47
【问题描述】:

有人知道为什么这段代码不起作用吗?

代码应该做的是获取列表中的所有用户并为他们制作单选按钮,然后每次单击它都会获取每个用户类中列表中的文本并将它们添加到文本框中

但问题是它只适用于最后添加的单选按钮,并不是所有的单选按钮都知道为什么。

 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";
                }
            }
        }   
    }

【问题讨论】:

  • RB.Click += RB_Click; 行移到foreach 循环内
  • 你为什么要删除这个问题? stackoverflow.com/questions/70526268/…
  • idk 我只是以为你不明白我的意思,我正在想办法自己做,但还没有运气

标签: c# events radio-button


【解决方案1】:

我可以在代码中看到两个问题。第一个是为Click 事件分配一个处理程序。要解决此问题,您需要移动线

RB.Click += RB_Click;

foreach 循环内。就目前而言,您的代码只是为最后创建的RadioButton 添加事件处理程序,而不是为您创建的每个事件处理程序。

第二个,你也会发现RB_Click事件处理器有问题。为确保选中的 RadioButton 得到更新,请将这行代码添加到 foreach 循环中:

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

【讨论】:

  • 很高兴帮助@MohamedHany。如果答案对您有用,请不要忘记将其标记为已接受。
【解决方案2】:

最简单的方法是完全避免使用RB_Click 方法。

试试这个:

private void UserMessages()
{
    int y = 8;
    int x = 7;

    if (TheClients.Count > 0)
    {
        foreach (HandleClients C1 in TheClients)
        {
            var rb = new RadioButton()
            {
                Text = C1.ClientUser,
                Location = new Point(x, y),
                Font = PL_UsersCont.Font,
                Visible = true,
                AutoSize = true,
                ForeColor = Color.Black,
                FlatStyle = FlatStyle.Flat,
            }
            rb.Click += (s, ea) => TXB_MSGS.Text = String.Join(Environment.NewLine, C1.ClientMessages);
            PL_UsersCont.Controls.Add(rb)
            y += rb.Height;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多