【问题标题】:C# dynamic radiobuttons, change textC# 动态单选按钮,更改文本
【发布时间】:2014-04-15 01:08:46
【问题描述】:

我有一个函数,每次用户单击一个按钮时都会创建 X 个单选按钮。代码现在看起来像这样(我也尝试过对它们进行分组)。现在我只使用我能想到的最简单的方法。

private void createRadioButtons(int amount, String answ)
{
   String[] splitAnsw = answ.Split(new Char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); // Splits up a string containing the radio button text

   for (int i = 0; i < amount; i++) {
        RadioButton rb = new RadioButton();
        rb.Text = splitAnsw[i];
        rb.Location = new Point(200, 300 + i * 20);
        this.Controls.Add(rb);
        Console.WriteLine(splitAnsw[i]);
    }
}

这确实创建了 X 个,但是问题出现在应该更新文本的时候。 splitAnsw 中的文本在写出时会发生变化并正确显示,但单选按钮中的文本不会更新。

【问题讨论】:

  • 每次按下按钮时,单选按钮是否创建并显示在之前的顶部(或下方)?在我看来是这样,因为那里没有清理。
  • 可能是这样,是的。但我真的不知道如何在创建新的之前删除它们。

标签: c# dynamic radio-button


【解决方案1】:

您在那里创建了很多控件,这将导致性能不佳。你需要稍微清理一下你的代码。

首先,在你的类中声明一个私有成员来保存对你新创建的控件的引用。

private IEnumerable<Control> _controls = null;

创建一个删除旧控件的方法:

private void ClearOldControls()
{
    if(_controls != null)
    {
        foreach(var control in _controls)
        {
            this.Controls.Remove(control);
            control.Dispose();
        }
    }
}

现在,在您的方法中,在创建新控件之前删除旧控件:

private void createRadioButtons(int amount, String answ)
{
    ClearOldControls();
    // Create new ones
    _controls = answ.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries)
        .Take(amount)
        .Select(answer =>
        {
            var rb = new RadioButton();
            rb.Text = answer;
            this.Controls.Add(rb);
            return rb;
        });
}

当然,在向容器中插入/删除控件之前不要忘记调用Control.SuspendLayout(),完成后不要忘记调用Control.ResumeLayout()

【讨论】:

  • 非常感谢您的广泛回复:-)。但是按钮不会显示(答案中的文本似乎没问题)。我会继续努力的!
  • @user1717380,这可能是因为我跳过了你设置每个控件的Location属性的那一行:)
  • 我确实添加了“rb.Location = new Point(200, 300 + (i * 10));” (临时位置只是为了测试),其中 i = 1 并且每次增加 1。不过还是什么都没有。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 2013-12-06
  • 2018-05-11
相关资源
最近更新 更多