【问题标题】:Is it possible to incorporate variables into a C# switch{case} statement [duplicate]是否可以将变量合并到 C# switch{case} 语句中[重复]
【发布时间】:2021-01-24 13:47:31
【问题描述】:

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

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

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

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

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 个 "PrizeTypeCombobox0X_ComboBoxChanged" 事件方法,除了相关控件标识符之外,它们是相同的em> 事件方法。控件命名约定为 Name00-09,因此在 "Case" 中将控件名称的最后一位替换为变量 (Name0X) > 声明应该是可能的。

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

 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 天内没有找到它。

我们将不胜感激。

【问题讨论】:

  • @Oliver Rogier thanx,但不是。我一定是把这个问题提得很糟糕。我要做的就是改变大小写“奖金金额”:{ AmountTextBox00.Visible = true; } 休息;案例“奖金金额”:{ AmountTextBox0[INSERT VARIABLE].Visible = true; } 休息;我会澄清这个问题。
  • @.ArtHansen 因此使用副本应该做到这一点,正如@.AshkanMobayenKhiabani 回答所揭示的那样(我没有真正阅读它,也没有阅读你的代码,抱歉,但你的评论证实了我对你的目标的理解,似乎)。
  • @OlivierRogier 请原谅我的无知,但我没有在“使用重复”和将变量合并到 switch{case} 语句之间建立联系;请澄清。
  • @.ArtHansen 一旦你使用它的可变代码字符串名称获得了一个对象实例的引用,并且一旦你将它转换为所需的类型,如此类重复和下面的答案中所述,你能够实现你的目标。但是您不能写出您尝试过的内容,因为例如controlName0[variable] 是一个索引数组,它不能是代码静态字符串名称与运行时字符串变量值的串联...... C# 不支持。与$"controlName0{variable}".action 相同:您需要按名称查找控件$"controlName0{variable},然后进行转换,然后调用action

标签: c# winforms


【解决方案1】:

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

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
                      

【讨论】:

  • @ArtHansen 看看我的第二个解决方案,这只是一个组合框的示例,您可以选择任何这样的控件。
  • (我删除了我的第一条评论,因为它没有帮助澄清)我不想以编程方式创建/查找特定控件。我正在尝试将变量合并到 switch{case1, case2, case3} 语句中,以便许多控制事件可以使用相同的语句。
猜你喜欢
  • 2014-11-10
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多