DataGridView 上 Foreach 循环中的其他条件不起作用
Else Condition in Foreach Loop on DataGridView Not Working
我想知道你是否可以在正确的方向上推动我 - 我有一些 C# 代码和两个 DataGridViews ()dgv1 和 dgv2)。按下按钮时,会从两个不同的数据库填充(通过数据表作为源)dataGridViews。两个 DataGridView 的列数相同,我使用第 4 列(单元格 3)来检查 dgv1 中的行在单元格 3 中的值是否与 dgv2 中的任何行相同。我想要实现的是;
- 如果在 dgv1 中选择了一行并且有匹配的行(单元格 3 中的值相同),则该行在 dgv2 中自动突出显示
- 当在 dgv1 中更改选择时,会发生同样的情况,即 foreach 循环检查 dgv2 以找到匹配项
- 如果 dgv1 中的选定行在 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;
}
}
}
我想知道你是否可以在正确的方向上推动我 - 我有一些 C# 代码和两个 DataGridViews ()dgv1 和 dgv2)。按下按钮时,会从两个不同的数据库填充(通过数据表作为源)dataGridViews。两个 DataGridView 的列数相同,我使用第 4 列(单元格 3)来检查 dgv1 中的行在单元格 3 中的值是否与 dgv2 中的任何行相同。我想要实现的是;
- 如果在 dgv1 中选择了一行并且有匹配的行(单元格 3 中的值相同),则该行在 dgv2 中自动突出显示
- 当在 dgv1 中更改选择时,会发生同样的情况,即 foreach 循环检查 dgv2 以找到匹配项
- 如果 dgv1 中的选定行在 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;
}
}
}