我是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
的方式。
答案 0 :(得分:1)
开关在case语句中不能具有动态评估的语句。必须对其进行静态评估。
在下面的帖子中说明原因:
C# switch statement limitations - why?
您还可以使用其他方式,如以下链接所述:
Is there a better alternative than this to 'switch on type'?
答案 1 :(得分:0)
您需要使用其他内容-else
或else 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;
}
但我不建议。