将 table 中的行显示到具有匹配列值的数据网格视图中

Displaying rows from table into datagridview with matched column value

我有一个包含名称和数据库的字符串列表 table 我想做的是在数据网格视图中显示来自 table 的行。所有包含与任何列表项相同的名称列值的行都将显示到数据网格中 view.I 使用 for 循环为此编写了代码,但它仅显示数据网格视图中的最后匹配行。

DBConnection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=FacesDatabase.mdb";
DBConnection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = DBConnection;

for(i=0;i<MatchName.ToArray().Length;i++)
{
      string query = "Select FaceID,FaceName,RollNo,FaceImage from " + tableName + " where FaceName='" + MatchName[i].ToString() + "'";
      command.CommandText = query;
      OleDbDataAdapter da=new OleDbDataAdapter(command);
      DataTable dt=new DataTable();
      da.Fill(dt);
      dataGridView1.DataSource=dt;
}

DBConnection.Close();

你可以使用INSQL关键词:

DBConnection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=FacesDatabase.mdb";
DBConnection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = DBConnection;
string query = "Select FaceID,FaceName,RollNo,FaceImage from " + tableName + " where FaceName IN ('"+ string.Join("','",MatchName.ToArray())+ "')";
command.CommandText = query;
OleDbDataAdapter da=new OleDbDataAdapter(command);
DataTable dt=new DataTable();
da.Fill(dt);
dataGridView1.DataSource=dt;
DBConnection.Close();

在您的示例中,您所做的是为每个 "MatchName"(无论是什么)查询数据库,并且对于您返回的每个结果集,您将其分配为数据网格的数据源。因此,您只会看到最后一个结果集,因为您正在覆盖以前的结果。

使用 IN 关键字,您只需访问数据库一次并将网格绑定到数据源一次。

我还建议使用命令参数,而不是按照使用字符串连接的方式构建查询。

您正在覆盖您的 gridview 数据源。你也可以这样做,

dataGridView1.DataSource = null;
for (i = 0; i < MatchName.ToArray().Length; i++)
{
    string query = "Select FaceID,FaceName,RollNo,FaceImage from " + tableName + " where FaceName='" + MatchName[i].ToString() + "'";
    command.CommandText = query;
    OleDbDataAdapter da = new OleDbDataAdapter(command);
    DataTable dt = new DataTable();
    da.Fill(dt);
    if (dataGridView1.DataSource != null)
    {
        DataTable dt2 = (DataTable)dataGridView1.DataSource;
        dt.Rows.Cast<DataRow>().ToList().ForEach(x => dt2.ImportRow(x));
        dt = dt2;
    }
    dataGridView1.DataSource = dt;
}