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 行。
我需要比较一个单元格中的 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 行。