web-dev-qa-db-fra.com

Comment puis-je rechercher des lignes dans un datatable avec une chaîne de recherche?

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?

15
Tarasov

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));
32
Rango

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();
4
ejhn5

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);
1
Tom Stein

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