使用匹配的列值将表中的行显示到datagridview中

时间:2015-05-12 12:50:40

标签: c# datagridview datatable

我有一个包含名称和数据库表的字符串列表,我想要做的是在datagridview中显示表中的行。包含与任何列表项相同的name列值的所有行都将显示在datagrid视图中。我使用for循环编写了此代码,但它只显示了datagridview中最后匹配的行。

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();

2 个答案:

答案 0 :(得分:1)

您可以使用 IN SQL关键字:

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();

在您的示例中,您正在执行的操作是查询每个&#34; MatchName&#34;的数据库。 (无论是什么),对于每个结果集,您都会将它作为数据网格的数据源分配给您。因此,您只能查看最后一个结果集,因为您要覆盖之前的结果。

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

我还建议使用命令参数,而不是像使用字符串连接那样构建查询。

答案 1 :(得分:0)

您正在覆盖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;
}