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) { ssortingng searchValue = textBox1.Text; int rowIndex = -1; dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect; try { foreach (DataGridViewRow row in dgvProjects.Rows) { if (row.Cells[row.Index].Value.ToSsortingng().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 de 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 provient de cette réponse

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) { ssortingng searchValue = textBox1.Text; dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect; try { foreach (DataGridViewRow row in dgvProjects.Rows) { if (row.Cells[2].Value.ToSsortingng().Equals(searchValue)) { row.Selected = true; break; } } } catch (Exception exc) { MessageBox.Show(exc.Message); } } 

Pourquoi ne construisez-vous pas d’abord un DataTable puis l’assignez au DataGridView 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 un DataReader partir d’une table de firebase database)

 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 textbox_textchange au textbox_textchange et à mesure de votre écriture.

 // This is the exact code for search facility in datagridview. private void buttonSearch_Click(object sender, EventArgs e) { ssortingng searchValue=textBoxSearch.Text; int rowIndex = 1; //this one is depending on the position of cell or column //ssortingng first_row_data=dataGridView1.Rows[0].Cells[0].Value.ToSsortingng() ; dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; try { bool valueResulet = true; foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.Cells[rowIndex].Value.ToSsortingng().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); } } 

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

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

Utilisez ce code sur l’événement KeyUp de KeyUp , remplacez “MyTable” par votre nom de table ou votre dataset, par le champ dans lequel vous souhaitez effectuer la recherche.

“MyTable” .DefaultView.RowFilter = “LIKE ‘%” + textBox1.Text + “%'”; this.dataGridView1.DataSource = “MyTable” .DefaultView;

Qu’en est-il de la relation entre les connexions à la firebase database 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.ConnectionSsortingng = "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(); 

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’object DataGridViewCell dans lequel le texte a été trouvé.

  ///  /// Check if a given text exists in the given DataGridView at a given column index ///  ///  ///  ///  /// The cell in which the searchText was found private DataGridViewCell GetCellWhereTextExistsInGridView(ssortingng 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 .ToSsortingng() if (row.Cells[columnIndex].Value != null && searchText == row.Cells[columnIndex].Value.ToSsortingng()) { // 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 } }