我有一个功能,每次用户点击按钮时都会创建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中的文本在写出时会更改并正确显示,但单选按钮中的文本不会更新。
答案 0 :(得分: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()
。