DataGridView 上 Foreach 循环中的其他条件不起作用

Else Condition in Foreach Loop on DataGridView Not Working

我想知道你是否可以在正确的方向上推动我 - 我有一些 C# 代码和两个 DataGridViews ()dgv1 和 dgv2)。按下按钮时,会从两个不同的数据库填充(通过数据表作为源)dataGridViews。两个 DataGridView 的列数相同,我使用第 4 列(单元格 3)来检查 dgv1 中的行在单元格 3 中的值是否与 dgv2 中的任何行相同。我想要实现的是;

现在,我在 dgv1 的 SelectionChanged 事件中编写了代码,并且 foreach 工作正常,并且完全按照我的要求执行....直到我设置 else 条件。当我设置 else 条件时,每次在 dgv1 中进行选择时都会显示消息框,即使存在匹配项也是如此。我需要的是仅当 dgv1 和 dgv2 之间不匹配时才显示消息框。下面是我的代码;

private void dgv1_SelectionChanged(object sender, EventArgs e)
        {

            this.dgv2.ClearSelection();
            this.dgv2.Tag = "";
            txtBxID.Text = "";
            
            foreach (DataGridViewRow dgv2row in dgv2.Rows)
            {

                if (dgv1.CurrentRow.Cells[3].Value.ToString() == Convert.ToString(dgv2row.Cells[3].Value))
                {
                    
                    dgv2.Selected = true;
                    txtBxID.Text = dgv2.Cells[6].Value.ToString();
                    dgv2.Tag = dgv2row.Cells[6].Value.ToString();
                    MessageBox.Show(Convert.ToString(dgv2.Tag));
                    
                }
            
            
               else
                {
                    MessageBox.Show("no match");
                }
            }

        }

我希望这一切都是有道理的,如果有人提出相同或相似的问题,我深表歉意。我仍在尝试熟悉 Whosebug。

编辑:根据@KlausGütter 和@KostandinVllahu 的两个回答,我尝试添加一个布尔变量,如下所示。不过,这已经解决了一半的问题。现在发生的事情是 - 当单击按钮(填充 dataGridViews)时,显示“不匹配”的消息框重复显示大约 5 次(大概是为了将每一行添加到 dataGridViews,在这种情况下为 5),一旦我在消息框上单击“确定”并且它们消失了,代码就会执行我想要的操作。布尔值哪里出错了?我放错地方了吗?我已经完成了以下操作;

private void dgv1_SelectionChanged(object sender, EventArgs e)
        {

                      
            this.dgv2.ClearSelection();
            this.dgv2.Tag = "";
            txtBxID.Text = "";
            
            Boolean match = false;
            
            foreach (DataGridViewRow dgv2row in dgv2.Rows)
            {

                if (dgv1.CurrentRow.Cells[3].Value.ToString() == Convert.ToString(dgv2row.Cells[3].Value))
                {
                    match = true;  
                    dgv2.Selected = true;
                    txtBxID.Text = dgv2.Cells[6].Value.ToString();
                    dgv2.Tag = dgv2row.Cells[6].Value.ToString();
                    MessageBox.Show(Convert.ToString(dgv2.Tag));
                    
                }
            
            }
               if (!match)
                {
                    MessageBox.Show("no match");
                }
            

        }

非常感谢。

MessageBoxes 通常非常烦人。当您在网格周围单击时,您很快就会厌倦不得不关闭“不匹配”消息框。想一想此时不得不关闭该框 5 次是多么烦人,将鼠标保持在同一个位置并点击点击点击点击点击点击即可。当您尝试工作时,它会变得更加令人厌烦,单击 dgv1 中的单元格,然后不得不一直跋涉到屏幕中间,关闭“不匹配”,返回并单击另一个单元格,再次关闭“不匹配”

相反,让我们显示和隐藏一个标签,如果需要,您可以将其设为粗体大红色。来来去去的标签不会打断用户的工作流程。尽量避免使用消息框...

标签的好处是我们可以在操作开始时显示它,如果找到一行则隐藏它,如果找不到则不隐藏它。这意味着在操作结束时它始终处于我们想要的状态。它隐含地包含我们的布尔逻辑

    private void dgv1_SelectionChanged(object sender, EventArgs e)
    {         
        this.dgv2.ClearSelection();
        this.dgv2.Tag = "";
        txtBxID.Text = "";
        noMatchWarningLabel.Visible = true;

        var lookingFor = dgv1.CurrentRow.Cells[3].Value.ToString();
        
        foreach (DataGridViewRow dgv2row in dgv2.Rows)
        {
            if (lookingFor == Convert.ToString(dgv2row.Cells[3].Value))
            {
                dgv2row.Selected = true;
                dgv2.Tag = txtBxID.Text = dgv2row.Cells[6].Value.ToString();
                noMatchWarningLabel.Visible = false;
            }
        }
    }