搜索数据表

时间:2012-10-15 16:42:43

标签: c# ado.net

我正在尝试对绑定到DataTable的datagridview进行“模糊”搜索。

我正在尝试使用DataTable.Select但我看不到它的工作原理。这是我的代码:

private void buttonSearch_Click(object sender, EventArgs e)
{
   string SearchString;

   if (this.textSearchString.Text == "")
   {
      return;
   }

   SearchString = this.textSearchString.Text;

   DataRow[] rows = dt.Select("PartName Like '" + SearchString + "%'");

   dt.Rows.Clear();
   foreach (DataRow row in rows)
   {
      dt.Rows.Add(row.ItemArray);
   }
   this.datagridInventory.DataSource = null;
   LoadInventoryList(); //loads up dt and formats columns
}

我不确定这是否正确,似乎不起作用。有人可以指出我的错误或更好地解释这个概念吗?

3 个答案:

答案 0 :(得分:1)

在迭代之前,您正在遍历一组清除(=空为)的数据行。

删除dt.Rows.Clear();

然后你要添加" dt"相同的" dt" ??

首先,这没有任何意义,因为clear()之后没有更多的行 其次,如果删除clear,则不再使用迭代它们并再次添加它们。

答案 1 :(得分:1)

尝试删除你的dt.Rows.Clear();命令。它会删除数据表中的所有行。

但是,如果要保留两组数据(原始数据集和所选行),则需要dt.clone()要搜索新数据表的表(.clone只需创建一个与第一个结构相同的新数据表,不复制数据),然后使用clonedTable.Rows.ImportRow()将查询结果转储到新表中。

DataTable clonedTable = dt.Clone();

DataRow[] rows = dt.Select("PartName Like '" + SearchString + "%'");

foreach ( DataRow row in rows ){
    cloneTable.importRow( row );
}

clonedTable.acceptChanges();

答案 2 :(得分:0)

StringBuilder searchQuery = new StringBuilder();

foreach (DataColumn column in dataTable.Columns)
{
  if (string.IsNullOrEmpty(searchQuery.ToString()))
    searchQuery.Append(column.ColumnName + " like '%" + searchString + "%' ");
  else
    searchQuery.Append(" OR " + column.ColumnName + " like '%" + searchString + "%' ");
}

DataRow[] foundRows = dataTable.Select(searchQuery.ToString());

if (foundRows != null && foundRows.Length > 0)
{
  dataTable = new DataTable();
  dataTable = foundRows.CopyToDataTable();
}

现在dataTable有搜索结果。

相关问题