首页 > 解决方案 > 是否可以将变量合并到 C# switch{case} 语句中

问题描述

==> 请注意:我 - OP - 强烈不同意这是重复的 <==
这个问题与“查找控件”无关,这是链接的“重复”问题/答案。正如标题所述,这个问题是关于将变量合并到 switch 语句的 Case 中。

我是 C# 新手,也是这个论坛的新手;如果我的某些术语不正确,或者我还没有完全理解论坛的口语和潜规则,敬请见谅。

我有一个用作奖品定义模板的 winForm。它有 10 行,每行 5 个控件,形成一个类似表格的演示文稿。在组合框下拉列表中选择奖品类型会导致显示特定于选择的用户输入文本框。

[[ 例如,如果用户在下拉菜单中选择“奖品金额”奖品类型,则会显示用于输入货币值的文本框;如果“预算百分比”选择了用于输入百分比的文本框/标签组合,则会显示。用户只能输入金额百分比,与奖品类型选择相关的文本框显示在同一表单空间中。]]

switch 语句用于链接选择和显示(仅显示第一行事件):

        private void PrizeTypeComboBox00_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selectPrizeType = (string)TypeComboBox00.SelectedItem;
            switch (selectPrizeType)
            {
                case "Amount of Prize":   { AmountTextBox00.Visible = true; } break;
                case "Percent of Budget": { PercentTextBox00.Visible = true; } break;
                default: break;
            }
        }

我需要用一个“AnyComboBox_ComboBoxChanged”事件方法替换具有 10 个“PrizeTypeCombobox0 X _ComboBoxChanged”事件方法,这些方法除了相关控件标识符之外是相同的。控件命名约定是名称00-09 ,因此应该可以在“Case”语句中用变量 (Name0 X )替换控件名称的最后一位。

我尝试了许多使用各种字符串的排列:

 case 1:   { controlName0[variable].action; }
 case 1:   { controlName0{variable}.action; } 
 case 1:   { controlName0(variable).action; }
 case 1:   { $"controlName0{variable}.action; }
 case 1:   { string.Format("{0}{1}{2}",controlName,variable,action); }
 case 1:   { switchOn(mstrTag, AmtSeleted); }

我还探索并尝试过使用——codeDOM、Dynamic Expresso、Action<>、Func<>、反射和 ICommand。

我确信必须有一个简单直接的方法来让它工作,但我在 2 天内没有找到它。

任何帮助将不胜感激。

标签: c#winforms

解决方案


您可以通过编程方式创建控件并创建一个数组:

var combos = Enumerable.Range(0,100)
.Select((x, i) => new ComboBox {Name = $"TypeComboBox{i}", Visible = false, ...})
.ToArray();

或者您可能只是按名称获取控件:

ComboBox GetCombo(int index)
{
    var name = "TypeComboBox" + index.ToString().PadLeft('0',2); 
    var combo = this.Controls[name];
    return combo;
}

也可以将现有控件分配给数组:

var combos = parent.Controls.OfType<ComboBox>()
             .OrderBy(c => c.Name)
             .ToArray();  //parent can be your form or whatever 
                          //control that contains your comboboxes
                      

推荐阅读