web-dev-qa-db-fra.com

Rechercher une valeur dans DataGridView dans une colonne

Je veux que l'utilisateur puisse rechercher un nombre dans une colonne du DataGridView (dgv). Le dgv peut contenir de nombreux enregistrements. Chaque enregistrement a un numéro de projet. Je souhaite donc que l'utilisateur puisse rechercher un numéro de projet dans la colonne Numéro de projet. Les colonnes que j'ai sont: ProjectID (non visible); Image (pas de texte en tête); Numéro de projet; Nom du projet; Entreprise; Contact.

Voici mon code:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchValue = textBox1.Text;
    int rowIndex = -1;

    dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        foreach (DataGridViewRow row in dgvProjects.Rows)
        {
            if (row.Cells[row.Index].Value.ToString().Equals(searchValue))
            {
                rowIndex = row.Index;
                dgvProjects.Rows[row.Index].Selected = true;
                break;
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}

Problème n ° 1: Ce qu’il fait jusqu’à présent: l’utilisateur tape le numéro du projet dans TextBox1. Lorsqu'il clique sur le bouton, le code recherche cette chaîne dans les lignes et, lorsqu'il trouve le numéro du projet, cette ligne est sélectionnée. Cela fonctionne bien, mais une seule fois. Lorsque je veux rechercher un autre numéro de projet, rien ne se passe.

Problème n ° 2: Je pense que cela peut être mieux fait en recherchant les valeurs de la colonne Nom du projet uniquement. Mais comment dois-je faire cela correctement?

Le code que je cherchais vient de cette réponse

4
FJPoort

Pourquoi utilisez-vous row.Cells [row.Index]. Vous devez spécifier l'index de la colonne que vous souhaitez rechercher (problème n ° 2). Par exemple, vous devez changer row.Cells [row.Index] en row.Cells [2] où 2 est l'index de votre colonne:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchValue = textBox1.Text;

    dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        foreach (DataGridViewRow row in dgvProjects.Rows)
        {
            if (row.Cells[2].Value.ToString().Equals(searchValue))
            {
                row.Selected = true;
                break;
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}
17
Danilo Vulović

Il est également préférable de séparer votre logique dans une autre méthode, ou peut-être dans une autre classe.

Cette méthode vous aidera à retrouver l'objet DataGridViewCell dans lequel le texte a été trouvé.

    /// <summary>
    /// Check if a given text exists in the given DataGridView at a given column index
    /// </summary>
    /// <param name="searchText"></param>
    /// <param name="dataGridView"></param>
    /// <param name="columnIndex"></param>
    /// <returns>The cell in which the searchText was found</returns>
    private DataGridViewCell GetCellWhereTextExistsInGridView(string searchText, DataGridView dataGridView, int columnIndex)
    {
        DataGridViewCell cellWhereTextIsMet = null;

        // For every row in the grid (obviously)
        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            // I did not test this case, but cell.Value is an object, and objects can be null
            // So check if the cell is null before using .ToString()
            if (row.Cells[columnIndex].Value != null && searchText == row.Cells[columnIndex].Value.ToString())
            {
                // the searchText is equals to the text in this cell.
                cellWhereTextIsMet = row.Cells[columnIndex];
                break;
            }
        }

        return cellWhereTextIsMet;
    }

    private void button_click(object sender, EventArgs e)
    {
        DataGridViewCell cell = GetCellWhereTextExistsInGridView(textBox1.Text, myGridView, 2);
        if (cell != null)
        {
            // Value exists in the grid
            // you can do extra stuff on the cell
            cell.Style = new DataGridViewCellStyle { ForeColor = Color.Red };
        }
        else
        {
            // Value does not exist in the grid
        }
    }
1
achehab
//     This is the exact code for search facility in datagridview.
private void buttonSearch_Click(object sender, EventArgs e)
{
    string searchValue=textBoxSearch.Text;
    int rowIndex = 1;  //this one is depending on the position of cell or column
    //string first_row_data=dataGridView1.Rows[0].Cells[0].Value.ToString() ;

    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        bool valueResulet = true;
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.Cells[rowIndex].Value.ToString().Equals(searchValue))
            {
                rowIndex = row.Index;
                dataGridView1.Rows[rowIndex].Selected = true;
                rowIndex++;
                valueResulet = false;
            }
        }
        if (valueResulet != false)
        {
            MessageBox.Show("Record is not avalable for this Name"+textBoxSearch.Text,"Not Found");
            return;
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}
0
KB Gowda

Pourquoi ne construisez-vous pas une DataTable en premier puis l'assignez à la DataGridView en tant que DataSource:

DataTable table4DataSource=new DataTable();

table4DataSource.Columns.Add("col00");
table4DataSource.Columns.Add("col01");
table4DataSource.Columns.Add("col02");

...

(ajoutez vos lignes, manuellement, dans un cercle ou via une DataReader à partir d'une table de base de données) (attribuez la source de données)

dtGrdViewGrid.DataSource = table4DataSource;

et ensuite utiliser:

(dtGrdViewGrid.DataSource as DataTable).DefaultView.RowFilter = "col00 = '" + textBoxSearch.Text+ "'";
dtGrdViewGrid.Refresh();

Vous pouvez même mettre ce morceau de code dans votre événement textbox_textchange et vos valeurs filtrées seront affichées au fur et à mesure que vous écrivez.

0
Rui Marques

Filtrer les données directement à partir de DataTable ou Dataset:

"MyTable".DefaultView.RowFilter = "<DataTable Field> LIKE '%" + textBox1.Text + "%'";
   this.dataGridView1.DataSource = "MyTable".DefaultView;

Utilisez ce code sur l'événement KeyUp de Textbox, remplacez "MyTable" pour votre nom de table ou votre ensemble de données, remplacez-le pour le champ où vous souhaitez effectuer la recherche.

0
Hull

"MyTable" .DefaultView.RowFilter = "LIKE '%" + textBox1.Text + "%'"; This.dataGridView1.DataSource = "MyTable" .DefaultView; 

Qu'en est-il de la relation entre les connexions à la base de données et le Datatable? Et comment dois-je régler le DefaultView correctement?

J'utilise ce code pour extraire les données:

con = new System.Data.SqlServerCe.SqlCeConnection();
con.ConnectionString = "Data Source=C:\\Users\\mhadj\\Documents\\Visual Studio 2015\\Projects\\data_base_test_2\\Sample.sdf";
con.Open();

DataTable dt = new DataTable();

adapt = new System.Data.SqlServerCe.SqlCeDataAdapter("select * from tbl_Record", con);        
adapt.Fill(dt);        
dataGridView1.DataSource = dt;
con.Close();
0
Mohamed Aitelhadj