web-dev-qa-db-fra.com

Comment utiliser textbox pour rechercher des données en mode grille?

Voici mon code actuel:

private void searchTextBox_TextChanged(object sender, EventArgs e)
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name='{0}'", searchTextBox.Text);

    }

Cependant, ma grille de données filtre tout et devient vide chaque fois que je tape quelque chose dans la zone de texte. Une idée pourquoi? Merci d'avance!

3
huehuehue

La raison vraisemblablement pour laquelle vous voyez une DataGridView vide est due à votre chaîne de filtrage recherchant des correspondances exactes avec le texte TextBox.

"Name='{0}'"

Étant donné que vous mettez à jour ce filtre dans l'événement TextBox.TextChanged, la première fois que vous entrez un caractère, aucune correspondance n'est trouvée. Par exemple, étant donné la grille suivante:

╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║        ║
╠════╬══════╣                    ╚════════╝
║ 1  ║ Foo  ║
║ 2  ║ Bar  ║
║ 3  ║ Baz  ║
╚════╩══════╝

Si vous entrez Bar, vous obtiendrez les résultats suivants:

╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║ B      ║
╠════╬══════╣                    ╚════════╝
╚════╩══════╝
╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║ Ba     ║
╠════╬══════╣                    ╚════════╝
╚════╩══════╝
╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║ Bar    ║
╠════╬══════╣                    ╚════════╝
║ 2  ║ Bar  ║
╚════╩══════╝

Si tel est le cas, j'ai fourni quelques options ci-dessous. Si ce n'est pas le cas, vous avez un mystère.


  1. Correspondances exactes: utilisez plutôt Le gestionnaire d'événements suivant afin que le filtre ne soit appliqué que Une fois que vous avez saisi le texte complet de la recherche:

    private void searchTextBox_Leave(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(searchTextBox.Text))
        {
            (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Empty;
        }
        else
        {
            (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name='{0}'", searchTextBox.Text);
        }
    }
    
  2. StartsWith correspond: pour un filtrage plus fluide des modifications de texte:

    private void searchTextBox_TextChanged(object sender, EventArgs e)
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name LIKE '{0}%'", searchTextBox.Text);
    }
    
  3. Contient des allumettes: encore une fois, filtrage du fluide:

    private void searchTextBox_TextChanged(object sender, EventArgs e)
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name LIKE '%{0}%'", searchTextBox.Text);
    }
    
10
OhBeWise

La réponse OhBeWise est la meilleure mais jusqu'à ce que j'ajoute quelque chose pour obtenir des points, je ne suis pas autorisé à l'apprécier.

donc je vais ajouter ceci, rappelez-vous dans la réponse de OhBeWise que vous filtrez les lignes à lister mais en utilisant le nom de colonne de la requête. la requête utilisée pour définir la source de données de la datagridview.

Par exemple, dans mon exemple, "LoginID" est dans l'instruction select. 

(dataGridViewTheToGrid.DataSource as DataTable).DefaultView.RowFilter = string.Format("LoginID LIKE '{0}%'", textBoxFindUserID.Text);
1
dcarl661

Créez simplement une nouvelle requête sur la base de données dans laquelle vous avez rempli la grille?

Utilisez le texte de la zone de texte avec LIKE

Modifier:

Si vous souhaitez que la grille se mette à jour avec la recherche, utilisez AJAX.

1
Chris