如何在控件名称中使用变量?(C#)
本文关键字:变量 控件 | 更新日期: 2023-09-27 17:50:49
我想把这段代码压缩成更简单的东西,这基本上是我写的代码,只是我把它缩短了很多。
if (chk1.Checked != true) lab1.Text = rng.Next(1, 7).ToString();
if (chk2.Checked != true) lab2.Text = rng.Next(1, 7).ToString();
我想要的不是很多非常相似的台词,而是几句一次性完成的台词。我尝试了一个"for"循环,但我不知道如何在控件名称中使用该变量。
for (int x = 1; x == 7; x++)
{
if (chk{x}.Checked != true) lab{x}.Text = rng.Next(1, 7).ToString();
}
显然{x}不起作用,但我能用什么来实现这一点吗?
最好创建两个大小相等的数组,一个用来放置复选框,另一个用来存放标签。然后你的for循环将看起来像这样:
for (int i = 0; i < 7; i++)
{
if (checkBoxes[i].Checked == false)
{
labels[i].Text = rng.Next(1, 7).ToString();
}
}
出于某种原因,我觉得这是一个WinForms应用程序,我可能错了,但你需要在未来更清楚。
每个控件都将有一个父控件。例如,您的所有控件都可能属于同一个Panel
控件。我假设这个例子就是这样。Control
有一个Controls
属性,它是子控件的集合,可以使用控件的名称访问这些控件。因此,假设您的控件与上面的变量命名相同(使用设计器或Name
属性命名(,那么您可以执行以下操作。。。
for(int i = 1; i <= 7; i++)
{
Checkbox checkbox = MyParentPanel.Controls["chk" + i] as Checkbox;
Label label = MyParentPanel.Controls["lab" + i] as Label;
if(checkbox != null && label != null && !checkbox.Checked)
{
label.Text = rng.Next(1, 7).ToString();
}
}
如果你不了解的任何内容,请告诉我
Dictionary
非常适合1:1的场景,其中CheckBox
"绑定"到Label
。这里,复选框充当Key
,Label
充当Dictionary
的值,可以对其进行强类型化,以确保在编译时处理正确类型的数据。
// Declare this at class level
private Dictionary<CheckBox, Label> myControls = new Dictionary<CheckBox, Label>();
// ...
// Dictionary initialization goes in the ctor
// unless you generate the controls at run-time.
// If you generate controls, place it after the generation itself
myControls.Add(chk1, lab1);
myControls.Add(chk2, lab2);
// and so on...
// ...
// When you want to cycle, do this:
foreach(var controlsPair in myControls) {
// controlsPair is KeyValuePair<CheckBox, Label>
if(controlsPair.Key.Checked) continue; // SEE (*) BELOW
controlsPair.Value.Text = rng.Next(1, 7).ToString();
}
(*(:我总是建议检查条件的真实性,因为在阅读代码时,我发现逻辑更容易理解,但最终的行为完全相同。
注意:此代码应适用于所有地方(WinForms、WPF、Silverlight等(