如何在开关案例的“案例”中使用变量

时间:2019-11-18 12:39:47

标签: c# switch-statement

我是C#的初学者,正在开发HMI(WinForms)。

我有一个充满数据的DataGridView和一些带有按钮的列。
当我单击列的按钮时,CellContentClick事件正在触发,我想使用切换用例来获取用户单击的确切列:
(简化代码)

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    var senderGrid = (DataGridView)sender;
    if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0) // if cell button
    {
        switch (e.ColumnIndex)
        {
            case Column1.Index: // <- not building because Column1.Index is a variable
                // do something
                break;
            case Column2.Index: 
                // do something
                break;
            //etc
            default: break;
        }
    }
}

问题在于ColumnX.Index不能放入case条件,因为它是一个变量。当然,我可以直接使用列索引的编号,但是由于我一直在开发并且总是在移动列,因此我想保留ColumnX.Index的方式。

4 个答案:

答案 0 :(得分:1)

开关在case语句中不能具有动态评估的语句。必须对其进行静态评估。

在下面的帖子中说明原因:

C# switch statement limitations - why?

您还可以使用其他方式,如以下链接所述:

Is there a better alternative than this to 'switch on type'?

答案 1 :(得分:0)

您需要使用其他内容-elseelse if语句可能对您有用。您还可以使用期望值的enum,并在case语句中引用它们。

答案 2 :(得分:0)

根据特定情况的需要,您还可以使用列的“标记”属性(它位于DataGridViewBand的{​​{1}}上)。当我使用表单时,我曾经将按钮应该触发的操作代码放置在那里。 因此,您可以在列中放置例如DataGridViewColumn,并在代码中拥有

Tag="UpdateRecord"

这样,您可以轻松地重新排列网格的列,而无需修复这些开关。 另外(作为迈向更清洁代码的下一步),您可以将“ UpdateRecord”文本放入某个类的switch (column.Tag as string) { case "UpdateRecord": // Update code break; // Other cases } 中,并在列定义和开关定义中使用它。

答案 3 :(得分:0)

  

我想保留开关盒方法

好吧,您可以abuse pattern matching

switch (c.ColumnIndex)
{
    case int i when i == Column1.Index:
        // do something
        break;
    case int i when i == Column2.Index:
        // do something
        break;
    //etc
    default: break;
}

但我不建议。