Datagridview 比较单元格字符串

Datagridview compare cell string

我需要比较一个单元格中的 2 个字符串值。(如果单元格 1 中的字符串类似于 'DPS' 和 'MAN') 但我不知道为什么我的 && 运算符不像我想的那样工作。我没有得到结果。

谁能解释一下我做错了什么?

private void Warning()
{
    foreach (DataGridViewRow row in dataGridView4.Rows)
        if (row.Cells[1].Value.ToString() == "DPS" 
            && row.Cells[1].Value.ToString() == "MAN")
        {
            panelWarnung.BackColor = Color.Red;
        }
        else
        {
            panelWarning.BackColor = Color.LightGreen;
        }
}

解决方案

foreach (DataGridViewRow row in dataGridView4.Rows)
            if (row.Cells[1].Value.ToString().Contains("DPS") == row.Cells[1].Value.ToString().Contains("MAN"))
                panelWarning.BackColor = Color.Red;

解决方案 II(检查整个列的两个值)

int dps = 0; int man = 0; 

        foreach (DataGridViewRow row in dataGridView4.Rows)
            if (row.Cells[1].Value.ToString() == "DPS") dps++; else if (row.Cells[1].Value.ToString() == "MAN") man++; 
        if (man > 0 && dps > 0 && abc > 0)
        {
            panelWarnung.BackColor = Color.Red;
        }

我取消删除了这个答案,因为自从看到你的屏幕截图后,我意识到它实际上非常相关


此答案适用于某行的单元格是否有 MAN 或另一行的另一个单元格是否有 DPS

例如,像这样的单元格:

MAN  
ext
DPS  
wow
MAN  
MAN  

这通常是一种心理学现象,我怀疑来自人们谈论事物集合时的说话方式:

Get all the red and green fruits out of this box

如果你把这个任务交给一个人,他们可能会给你一把红色水果和一把绿色水果..

..但这实际上是“或”

Look through this box, and if a fruit is red or if it is green, take it out and give it to me

我们已经根据每个单独的水果提出了请求,这意味着它不再用“和”来表达:

Look through this box, and if a fruit is red and if it is green, take it out and give it to me

C# 会在 row-by-row 的基础上考虑你的行,如果你想要 MAN 行是红色的,你也希望 DPS 行是红色的,那么你需要使用 ||要么。从人类的角度来看,当你说“MAN 的是红色的,DPS 的是红色的”时,你在整个集合中使用 。但是当你单独处理项目时,你不能说“如果它是 MAN 和 DPS,就让它变红”。你说“如果它是 MAN 或者它的 DPS;让它变红”

相反,您需要:

row.Cells[1].Value.ToString() == "DPS" || row.Cells[1].Value.ToString() == "MAN")
                                       ^^
                                 note the OR, not AND

总体而言,我推荐以下代码:

private void Warning()
{
    panelWarning.BackColor = Color.LightGreen;
    foreach (DataGridViewRow row in dataGridView4.Rows)
        if (row.Cells[1].Value.ToString()== "DPS" || row.Cells[1].Value.ToString() == "MAN")
            row.Cells[1].Style.BackColor = panelWarnung.BackColor = Color.Red;
        else
            row.Cells[1].Style.BackColor = Color.White;
}

如果是 MAN 或 DPS,这将以红色点亮任何单个单元格,并以红色点亮警告面板


编辑,并稍微调整一下逻辑:如果您希望跨行进行检查,这样如果至少一个单元格是 MAn 并且至少另一个单元格是 DPS,您可以点亮面板,然后您可以计算所有出现次数:


    int dps = 0; 
    int man = 0; 
    foreach (DataGridViewRow row in dataGridView4.Rows){
      if (row.Cells[1].Value.ToString() == "DPS") 
        dps++; 
      else if (row.Cells[1].Value.ToString() == "MAN") 
        man++; 
    }

    if (man > 0 && dps > 0) { 
      panelWarnung.BackColor = Color.Red; 
    }

这可以使用 LINQ 缩短为:

var vals = dataGridView4.Rows.Cast<DataGridViewRow().Select(r => r.Cells[1].Value.ToString());
if(rows.Any(v => v == "MAN") && rows.Any(v => v == "DPS"))
  panelWarnung.BackColor = Color.Red; 
else
  panelWarnung.BackColor = Color.LightGreen; 

它在概念上是一样的,但实际上性能更高一些,因为它不计算每一个;它只是获取列中的每个值,作为一个字符串,然后它询问“这些值中的任何一个是“MAN”吗?这些值中的任何一个是“DPS”吗? -> 警告。其他 -> 清除

此答案适用于何时单个单元格将包含同时包含 MAN 和 DPS 的字符串

例如,像这样的单元格:

MANDPS
DPS,MAN
DPSinghs MANager

if DPS and MAN is in the cell the warningPanel should turn red

那是

row.Cells[1].Value.ToString().Contains("DPS") 
    && row.Cells[1].Value.ToString().Contains("MAN")

Contains 测试字符串是否存在于单元格中的某处。 == 测试单元格中的整个字符串是否完全等于某个值。并且没有变量可以同时等于两个不同的值

总体而言,我推荐以下代码:

private void Warning()
{
    panelWarning.BackColor = Color.LightGreen;
    foreach (DataGridViewRow row in dataGridView4.Rows)
        if (row.Cells[1].Value.ToString().Contains("DPS") && row.Cells[1].Value.ToString().Contains("MAN"))
            row.Cells[1].Style.BackColor = panelWarnung.BackColor = Color.Red;
        else
            row.Cells[1].Style.BackColor = Color.White;
}

针对以下评论更改了答案:

foreach (DataGridViewRow row in dataGridView4.Rows)
    if (row.Cells[1].Value.ToString().Contains("DPS")
            && row.Cells[1].Value.ToString().Contains("MAN")) {
        panelWarnung.BackColor = Color.Red;
        break; // <-- NB: Stop the loop after the first invalid cell!
    }

现在,如果 DPS 和 MAN 都包含在其中一个单元格中,您的面板应该设置为指定的颜色。

但是请注意您还需要在将颜色设置为红色后添加 break 语句,否则您可能会冒着被覆盖并设置为任何结果的风险找到 last 行。