目前,我在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;
}
在case
行Expecting constant value
上向我返回错误。
那我该如何做呢?
答案 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
事件中调用它。