Как я могу искать строки в datatable с помощью searchstring?
Привет я хочу искать строки в моем 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();
}
но у меня есть ошибка в моей строке . что я могу сделать, если я хочу искать эти столбцы?
4 ответов
вы получили ошибку потому, что параметр Select
- это filterExpression и вы прошли все колонны. Поймите filterExpression как WHERE
предложение в sql. Вам нужны все столбцы, но вы хотите фильтровать только по одному. Вы все равно получаете все столбцы, так как они являются частью DataTable
/DataView
так что вам не нужно перечислять их явно.
вы можете использовать DataTable.Select
, DatView.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));
Если кому-то еще нужно вернуть конкретно DataTable вы можете использовать код ниже:
DataTable dtResult= tb.Select("CREATOR LIKE '%"+searchstring+"%'").CopyToDataTable();
Я только что сделал метод расширения в класс 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 dt = getData();
dataTable.SearchInAllColums(Keyword, StringComparison.OrdinalIgnoreCase);
вы можете создать запрос, который собираетесь использовать в 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 ...