我有一个DataGridView
,我可以从中选择一些行并将其插入另一个DataGridView
,删除原始DataGridView
中的行。要做到这一点,我会做一些验证,看看是否有一个相同的名称文件或类似的东西。
这是我在转移Button
中使用的代码:
foreach (DataGridViewRow dtrow2 in frm.dataGridView2.Rows)
{
con = new SqlConnection(cs.DBConn);
con.Open();
string querySelect = "SELECT FileName FROM SentRecycle WHERE FileName ='" + dtrow2.Cells[2].Value.ToString() + "'";
cmd = new SqlCommand(querySelect);
frm.ShowDataGridView();
cmd.Connection = con;
reader = cmd.ExecuteReader();
if (reader.Read() == true)
{
MessageBox.Show("This file already in use!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
if ((reader != null))
{
reader.Close();
}
return;
}
}
但我无法删除它,因为当我将重复的文件放入测试应用程序时,它总是会查找第一行而不检查其他行。你知道我怎么解决它?
答案 0 :(得分:2)
return
语句会导致foreach
在第一场比赛后停止
调用return
将退出它所在的方法,而不管可能正在执行的任何循环,这是导致问题的原因。
另外,其他一些评论:
- 该消息未说明正在使用哪个文件
- 对于正在使用的十几个文件,会显示十几个弹出窗口
- 您不需要为每个查询创建新连接,一个就足够了
- 使用SqlParameter
比将文件名连接到查询更好,更安全。
结果看起来像这样:
public bool AreFilesInUse()
{
var FilesInUse = new List<string>();
con = new SqlConnection(cs.DBConn);
con.Open();
var sql = "SELECT FileName FROM SentRecycle WHERE FileName = @file";
cmd = new SqlCommand(sql);
cmd.Parameters.Add("@file", SqlDbType.NVarChar);
cmd.Connection = con;
foreach (DataGridViewRow dtrow2 in frm.dataGridView2.Rows)
{
var file = dtrow2.Cells[2].Value.ToString();
cmd.Parameters["@file"].Value = file;
// frm.ShowDataGridView(); // does not seem useful here, maybe before the loop
var reader = cmd.ExecuteReader();
if (reader.Read())
FilesInUse.Add(file); // remember file name
reader.Close();
}
bool foundAny = FilesInUse.Count > 0;
if (foundAny)
{
var files = string.Join("\r\n", FilesInUse);
MessageBox.Show("The following files are already in use:\r\n" + files, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
con.Close();
return foundAny;
}
}
答案 1 :(得分:1)
这是因为您不允许您的代码检查:)
循环中的所有行。删除foreach
关键字并检查其他关键字。如果您在其他地方需要这些文件名,请将它们放在列表或类似的内容中。还检查文件名是否为空或空以处理异常。检查一下:
return