【问题标题】:Displaying rows from table into datagridview with matched column value将表中的行显示到具有匹配列值的数据网格视图中
【发布时间】:2015-05-12 12:50:40
【问题描述】:

我有一个包含名称和数据库表的字符串列表,我想做的是在 datagridview 中显示表中的行。包含与任何列表项相同的名称列值的所有行都将显示到 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();

【问题讨论】:

  • '因为您只将最后的结果分配为数据源。
  • 是的,但我希望所有匹配的行从表到 datagridview

标签: c# datagridview datatable


【解决方案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();

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

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

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

【讨论】:

  • 此异常即将到来 没有为一个或多个必需参数提供值。当我将此行 (" + string.Join(",", MatchName.ToArray()) + ") 更改为此 (' " + string.Join(",", MatchName.ToArray()) + " ') 时预期被删除,但 datagridview 中没有显示任何内容,仅显示列名
  • select 语句没有返回任何行,它返回 0 零。我使用以下查询对其进行了检查。 "Select count(*) from " + tableName + " where FaceName IN ('" + string.Join(",",MatchName.ToArray()) + "')";
  • 终于成功了,问题在于查询字符串。join函数在修改查询后没有以正确的格式获取数组项进行查询。非常感谢您的帮助,字符串查询=“ Select * from " + tableName + " where FaceName IN ('"+ string.Join("','",MatchName.ToArray())+ "')";
  • 很高兴能提供帮助。您对缺少的单引号是正确的。干杯。
【解决方案2】:

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

【讨论】:

  • 抛出异常没有行可以添加到没有列的 DataGridView 控件。必须先添加列。
  • 现在这个 dataGridView1.Rows.Add(dt.Rows) 出现异常;当控件是数据绑定时,行不能以编程方式添加到 DataGridView 的行集合中。
  • 当然我也会试试这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多