获取列索引作为常量值

时间:2019-01-18 07:57:57

标签: c# datagridview switch-statement

目前,我在dataGridView1_CellValidating事件中有这样的代码:

if(e.ColumnIndex == dataGridView1.Columns["FIRST"].Index)
{
    // Some code
}
else if(e.ColumnIndex == dataGridView1.Columns["Second"].Index)
{
    // Some code
}
else if(e.ColumnIndex == dataGridView1.Columns["Third"].Index)
{
    // Some code
}

就像这样,因为我不能在switch语句中使用它:

switch(e.ColumnIndex)
{
    case dataGridView.Columns["First"].Index:
        break;
    case dataGridView.Columns["Second"].Index:
        break;
    case dataGridView.Columns["Third"].Index:
        break;
}

caseExpecting constant value上向我返回错误。

那我该如何做呢?

5 个答案:

答案 0 :(得分:1)

如果您确实要使用开关,则可以在开关情况下使用模式匹配

PS:适用于C#7.0或更高版本

switch(e.ColumnIndex)
{
    case var _ when (dataGridView.Columns["First"].Index == e.ColumnIndex):
        break;
    case var _ when (dataGridView.Columns["Second"].Index == e.ColumnIndex):
        break;
    case var _ when (dataGridView.Columns["Third"].Index == e.ColumnIndex):
        break;
}

答案 1 :(得分:1)

switch语句在抱怨,因为该语句的“ case”部分“需要”“ CONSTANT”值。语句dataGridView.Columns["First"].Index将始终返回相同的值……除非您移动列……就可以这样做。这就是为什么编译器将dataGridView.Columns["First"].Index中重新调整的值视为不是“常量”的原因。

这是有道理的,因为名为“ First”的列的“ column index”可能在网格中的任何列索引处……因此出现错误。

一种可能的解决方案是获取当前列“名称”的字符串值,然后关闭列“名称”,如下所示。

string columnName = dataGridView.Columns[e.ColumnIndex].Name;
switch (columnName) {
  case "First":
    MessageBox.Show("Cell Validated is in 'FIRST' column");
    break;
  case "Second":
    MessageBox.Show("Cell Validated is in 'Second' column");
    break;
  case "Third":
    MessageBox.Show("Cell Validated is in 'Third' column");
    break;
}

答案 2 :(得分:0)

也许,您首先要使常量值并为其分配dataGridView.Columns [“ First”]。Index。 例如:

int a = {given index}
const int IndexOfFirstCol = dataGridView.Columns["First"].Index;
const int IndexOfSecCol = dataGridView.Columns["Second"].Index;

然后

switch(a)
{
    case IndexOfFirstCol:
      //do smth
      break;
    case IndexOfSecCol:
      //do smth
      break;
}

答案 3 :(得分:0)

我将有另一种方法,使用Dictionnary(来自命名空间System.Collections.Generic)以这种方式构建的方法

键是datagridview中列的索引(“第一”,“第二” ...)

该值代表要执行的方法(在每个if / else if中用什么替换// some code

例如:

/*
 * This example is written for console application, that can be tested easily.
 * The logic can be rewritten for WinForm
 */

static void TheFirstCase()
{
    //This should be replaced by the differents actions you want to do
    Console.WriteLine("first case"); 
}

static void TheSecondtCase()
{
    Console.WriteLine("second case");
}

static void TheThirdCase()
{
    Console.WriteLine("third case");
}

static void Main(string[] args)
{
    Dictionary<string, Delegate> MyDic = new Dictionary<string, Delegate>
    {
        //If you need parameters in the TheFirstCase(), use new Action<TypeOfTheFirstParam, TypeOfTheSecondParam, ...>(TheFirstCase)
        //If your Method needs to return something, use Func instead of Action
        { "First", new Action(TheFirstCase) }, 
        { "Second", new Action(TheSecondtCase) },
        { "Third", new Action(TheThirdCase) }
    };
    // in your question, this is e.ColumnIndex
    var ValueInColIndex = 42;

    // in your question, this is dataGridView.Columns
    var DataGridViewDatas = new Dictionary<string, int>
    {
        {  "First", 0 },
        {  "Second", 42 },
        {  "Third", 69 }
    };

    foreach (var MyAction in MyDic)
    {
        if (DataGridViewDatas[MyAction.Key] == ValueInColIndex)
        {
            MyAction.Value.DynamicInvoke();
        }
    }
}

输出:

  

第二种情况

答案 4 :(得分:0)

如果不能使用C#7.0中的模式匹配,则还有另一种方法,使用字典,其中的键是检查条件(条件)的函数,值是要执行的动作。对于您的代码,它看起来像:

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    var caseDictionary = new Dictionary<Func<bool>, Action>()
    {
        { () => (e.ColumnIndex == dataGridView1.Columns["First"].Index), () => {  MessageBox.Show("First");}},
        { () => (e.ColumnIndex == dataGridView1.Columns["Second"].Index), () => { MessageBox.Show("Second");}},
        { () => (e.ColumnIndex == dataGridView1.Columns["Third"].Index), () => { MessageBox.Show("Third");}}
    };
    caseDictionary.Where(caseRecord => caseRecord.Key()).Select(action => action.Value).FirstOrDefault()?.Invoke();
}

您当然可以在构造函数中声明Dictionary,然后在CellValidating事件中调用它。