我有一个datagriedview,其中包含许多行数字。
我有一个数据表,其中一列包含数字。
我要突出显示不在datatable行中的datagrideview行。我只比较一列
这是我的代码:
DataTable SeatNum = new DataTable();
SeatNum = "Select Nums from dbo.Nums";
try
{
foreach (DataGridViewRow row in dataGridView2.Rows)
{
if (row.IsNewRow) { return; }
foreach (DataRow dtrow in SeatNum.Rows)
{
if (dtrow[0].ToString() != (row.Cells[0].Value.ToString()))
{
row.Cells[0].Style.BackColor = Color.Red;
MessageBox.Show("Not Exist" + row.Cells[0].Value.ToString() + "\r\n" + dtrow[0].ToString(), "Caution", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
break;
}
else
{
row.Cells[0].Style.BackColor = row.DefaultCellStyle.BackColor;
MessageBox.Show("Exist" + row.Cells[0].Value.ToString() + "\r\n" + dtrow[0].ToString(), "Caution", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
break;
}
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
此代码仅突出显示与数据表中第一行不匹配的行
谢谢。
答案 0 :(得分:0)
我修复了代码,现在它可以按预期运行。
我替换了:
foreach (DataRow dtrow in SeatNum.Rows)
到for循环:
for (int i = 0; i < SeatNum.Rows.Count; i++)
然后我将if语句更改为:
if (SeatNum.Rows[i][0].ToString() != (row.Cells[0].Value.ToString()))
然后,我删除了break
语句中的Then
并将其保留在else
语句中。
谢谢。
更新:
更好的解决方案,更快,更合理
DataTable SeatNum;
List<int> SeatNums = (from row in SeatNum.AsEnumerable() select Convert.ToInt32(row["Num"])).ToList();
bool OutOfRang = false; ;
foreach (DataGridViewRow row in dataGridView2.Rows)
{
if (!row.IsNewRow)
{
if (!SeatNums.ToList().Contains(Convert.ToInt32(row.Cells[0].Value)))
{
OutOfRang = true;
row.Cells[0].Style.BackColor = Color.Red;
MessageBox.Show("This Num ( " + row.Cells[0].Value.ToString() + " ) not in DataTable list");
countSeatsbr++;
row.ErrorText = "Not in DataTable list.";
}
}
}
if (OutOfRang)
{
return;
}
else
{
DoSomethingElse()
}