[英]How I can search rows in a datatable with a 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();
}
但是我的字符串中有錯誤。
如果我想搜索這些列,我該怎么做?
您會收到錯誤消息,因為Select
的參數是filterExpression並且您已傳遞所有列。 將 filterExpression 理解為 sql 中的WHERE
子句。 您想要所有列,但只想按一列進行過濾。 無論如何,您都會獲得所有列,因為它們都是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 dtResult= tb.Select("CREATOR LIKE '%"+searchstring+"%'").CopyToDataTable();
為此,我剛剛為 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);
您可以構建要在選擇中使用的查詢。
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 ...
搜索任何列的靜態方法
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.