C#中根据数字控制对应label显示的更优雅实现方案
C# 控制Label显示状态的优雅实现方案
方案1:预定义控件数组(推荐,性能最优)
提前将所有按顺序命名的Label存入数组,后续直接通过索引操作,避免硬编码每个case:
- 首先在窗体中声明全局数组并初始化:
// 窗体级全局变量 private Label[] _letterLabels; // 在窗体构造函数 InitializeComponent() 之后或者 Form_Load 事件中完成初始化 _letterLabels = new Label[] { lblLetter0, lblLetter1, lblLetter2, lblLetter3, lblLetter4, lblLetter5, lblLetter6 };
- 改写业务方法:
private void MakeLabelVisible(int number) { // 参数合法性校验,避免索引越界 if (number < 0 || number >= _letterLabels.Length) return; // 隐藏所有标签 foreach (var label in _letterLabels) { label.Visible = false; } // 按需显示<=number的标签(如果仅需要显示传入number对应的单个标签,直接给对应索引赋值即可) for (int i = 0; i <= number; i++) { _letterLabels[i].Visible = true; _letterLabels[i].Text = string.Empty; } }
方案2:动态查找控件(灵活,无需手动维护数组)
如果不想手动维护数组,可以通过控件名称动态查找对应Label,适合标签数量可能变动的场景:
private void MakeLabelVisible(int number) { // 遍历0-6的所有标签 for (int i = 0; i <= 6; i++) { // 查找对应名称的Label控件,第二个参数true表示递归查找子容器内的控件 var targetLabel = Controls.Find($"lblLetter{i}", true).FirstOrDefault() as Label; if (targetLabel == null) continue; targetLabel.Visible = i <= number; if (targetLabel.Visible) { targetLabel.Text = string.Empty; } } }
补充说明
- 如果你要保持和原有switch逻辑一致,仅显示传入number对应的单个标签,只需要把循环里的判断条件改为
i == number即可 - 两种方案都比原有的硬编码switch冗余写法扩展性更好,后续新增标签只需要调整数组或者遍历上限即可,不需要新增case分支
内容的提问来源于stack exchange,提问作者Mathieu Savage
相关产品推荐
相关产品推荐

