我该如何使用搜索字符串在数据表中搜索行?

22

我想在我的DataTable中搜索行。

我尝试过这样做:

 protected void imggastsuche_Click(object sender, EventArgs e) 
        {
            string searchstring = txtgastsuche.Text;

            DataTable tb = DataBaseManager.GetDataTable(mysqlconnectionstring);

            DataRow[] foundRows = tb.Select("FIRSTNAME,LASTNAME,NAME,COMPANY,TIMEFROM,TIMETO,CREATOR Like '%" + searchstring + "%'");

            tb = foundRows.CopyToDataTable();

            this.ListView.DataSource = tb;
            this.ListView.DataBind();

        }

但是我的字符串中出现了错误。

如果我想要在这些列中进行搜索,我该怎么办?

5个回答

46
你得到该错误是因为传递给Select方法的参数是filterExpression,而你已经传递了所有列。把filterExpression看作是SQL语句中的WHERE子句。你想获取所有列,但只想按一个条件过滤。由于所有列都属于DataTable/DataView,所以不需要明确列出它们,你仍然可以获取所有列。
你可以使用DataTable.SelectDataView.RowFilter方法或LINQ-to-DataSet
我更喜欢使用LINQ-To-DataSet:
var filtered = tb.AsEnumerable()
    .Where(r => r.Field<String>("CREATOR").Contains(searchstring));

ADO.NET(DataTable.Select):

DataRow[] filteredRows = tb.Select("CREATOR LIKE '%" + searchstring + "%'");

ADO.NET(DataView.RowFilter):

 tb.DefaultView.RowFilter = "CREATOR LIKE '%" + searchstring + "%'";
如果你想要在任何一列中搜索这个字符串,请使用以下方法:
DataRow[] filteredRows = tb.Select("FIRSTNAME LIKE '%" + searchstring + "%' OR LASTNAME LIKE '%" + searchstring + "%' OR NAME LIKE '%" + searchstring + "%' OR COMPANY LIKE '%" + searchstring + "%' OR CREATOR LIKE '%" + searchstring + "%'");

与 Linq 相同:

var filtered = tb.AsEnumerable()
    .Where(r => r.Field<String>("FIRSTNAME").Contains(searchstring)
           ||   r.Field<String>("LASTNAME").Contains(searchstring))
           ||   r.Field<String>("NAME").Contains(searchstring)
           ||   r.Field<String>("COMPANY").Contains(searchstring)
           ||   r.Field<String>("CREATOR").Contains(searchstring));

但是我想在所有列中搜索 :( - Tarasov
@Tarasov:你想要所有列,但是你想要按照其中一列进行过滤,因为它们都是DataTable/DataView的一部分,所以你仍然会得到所有列。 - Tim Schmelter
我想要在每一列中搜索这个搜索字符串。我以为我可以做到这一点 :( - Tarasov

9
如果有其他人需要返回一个特定的DataTable,您可以使用下面的代码:

如果有其他人需要返回一个特定的DataTable,您可以使用下面的代码:

DataTable dtResult= tb.Select("CREATOR LIKE '%"+searchstring+"%'").CopyToDataTable();

4
我刚刚为 DataTable 类创建了一个扩展方法(extension method),它可以返回一个新的 DataTable,其中只包含你想要的行。
public static DataTable SearchInAllColums(this DataTable table, string keyword, StringComparison comparison)
{
    if(keyword.Equals(""))
    {
        return table;
    }
    DataRow[] filteredRows = table.Rows
           .Cast<DataRow>()
           .Where(r => r.ItemArray.Any(
           c => c.ToString().IndexOf(keyword, comparison) >= 0))
           .ToArray();

    if (filteredRows.Length == 0)
    {
        DataTable dtTemp = table.Clone();
        dtTemp.Clear();
        return dtTemp ;
    }
    else
    {
        return filteredRows.CopyToDataTable();
    }
}

使用方法:

DataTable dataTable = getData();
dataTable.SearchInAllColums(Keyword, StringComparison.OrdinalIgnoreCase);

0
你可以构建你将要在 select 中使用的查询。
            if(TextBoxCusName.Text != "")
            {
                query = "CustomerName LIKE '%" + TextBoxCusName.Text.Trim()+"%' AND ";
            }
            if(TextBoxCusContact.Text != "")
            {
                query = query + "CustomerNo LIKE '%" + TextBoxCusContact.Text.Trim() + "%' AND ";
            }
            if(TextBoxVehicleNo.Text != "")
            {
                query = query + "VehicleNo LIKE '%" + TextBoxVehicleNo.Text.Trim()+"%'";
            }
            if(query.EndsWith("AND "))
            {
                query = query.Remove(query.Length - 4);
            }
            DataRow[] result = dataCustomerAndVehicle.Select(query);

这相当于

select * from dataCustomerAndVehicle where CustomerName LIKE '%...%' AND ...

0

搜索任何列的静态方法

public static DataTable SearchInAllColums(DataTable table, string keyword)
{
    StringComparison comparison = StringComparison.OrdinalIgnoreCase;

    if (keyword.Equals(""))
    {
        return table;
    }

    DataRow[] filteredRows = table.Rows
           .Cast<DataRow>()
           .Where(r => r.ItemArray.Any(
           c => c.ToString().IndexOf(keyword, comparison) >= 0))
           .ToArray();

    if (filteredRows.Length == 0)
    {
        DataTable dtTemp = table.Clone();
        dtTemp.Clear();
        return dtTemp;
    }
    else
    {
        return filteredRows.CopyToDataTable();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接