将 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;
}
我有一个包含名称和数据库的字符串列表 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;
}