salut je veux rechercher des lignes dans mon DataTable pour ceci j'essaye ceci:
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();
}
Mais j'ai une erreur dans ma chaîne. Que puis-je faire si je veux chercher dans ces colonnes?
Vous obtenez l'erreur car le paramètre à Select
est filterExpression et vous avez transmis toutes les colonnes. Comprenez le filterExpression comme une clause WHERE
dans SQL. Vous voulez toutes les colonnes mais vous voulez filtrer par un seul. De toute façon, vous obtenez toutes les colonnes car elles font toutes partie de la variable DataTable
/DataView
, vous n'avez donc pas besoin de les lister explicitement.
Vous pouvez utiliser les méthodes DataTable.Select
, DatView.RowFilter
ou LINQ-to-DataSet
:
LINQ-To-DataSet (que je préfère):
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 + "%'";
Si vous voulez plutôt rechercher cette string
dans une colonne:
DataRow[] filteredRows = tb.Select("FIRSTNAME LIKE '%" + searchstring + "%' OR LASTNAME LIKE '%" + searchstring + "%' OR NAME LIKE '%" + searchstring + "%' OR COMPANY LIKE '%" + searchstring + "%' OR CREATOR LIKE '%" + searchstring + "%'");
La même chose avec 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));
Si quelqu'un d'autre a besoin de retourner spécifiquement un DataTable, vous pouvez utiliser le code ci-dessous:
DataTable dtResult= tb.Select("CREATOR LIKE '%"+searchstring+"%'").CopyToDataTable();
Je viens de créer une méthode extension à la classe DataTable pour cela . Elle retourne un nouveau objet Datatable contenant uniquement les lignes souhaitées.
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();
}
}
Utilisation:
DataTable dataTable = getData();
dataTable.SearchInAllColums(Keyword, StringComparison.OrdinalIgnoreCase);
vous pouvez construire la requête que vous allez utiliser dans la sélection.
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);
cet équivalent à
select * from dataCustomerAndVehicle where CustomerName LIKE '%...%' AND ...