web-dev-qa-db-ja.com

検索文字列を使用してデータテーブル内の行を検索するにはどうすればよいですか?

こんにちは私はこれのために私の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();

        }

しかし、文字列にエラーがあります。この列を検索したい場合はどうすればよいですか?

15
Tarasov

SelectのパラメーターがfilterExpressionであり、すべての列を渡したため、エラーが発生します。 SQLのWHERE句としてfilterExpressionを理解します。すべての列が必要ですが、1つだけフィルタリングしたい場合。それらはすべてDataTable/DataViewの一部であるため、とにかくすべての列を取得します。したがって、明示的にリストする必要はありません。

DataTable.SelectDatView.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 + "%'";

代わりに任意の列でこのstringを検索する場合:

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));
35
Tim Schmelter

他の誰かが特にDataTableを返す必要がある場合、以下のコードを使用できます。

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

このために、DataTableクラスに拡張メソッドを作成しました。必要な行のみを含む新しい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 dtProcessesTemp = table.Clone();
        dtProcessesTemp.Clear();
        return dtProcessesTemp;
    }
    else
    {
        return filteredRows.CopyToDataTable();
    }
}

使用法:

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

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
Naseeruddin V N