在列中的DataGridView中搜索值

我希望用户能够在DataGridView(dgv)的列中搜索数字。 dgv可以保存很多记录。 每条记录都有一个项目编号。 所以我希望用户能够在项目编号列中搜索项目编号。 我的列是:ProjectID(不可见); 图像(无headertext); 项目编号; 项目名; 公司; 联系。

这是我的代码:

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); } } 

问题#1:到目前为止它做了什么:用户在TextBox1中键入项目编号。 当他/她单击该按钮时,代码将在行中搜索此字符串,并在找到项目编号时,该行将被选中。 它工作正常,但只有一次。 当我想搜索其他项目编号时,没有任何反应。

问题2:我认为这可以通过仅搜索列项目名称的值以更好的方式完成。 但是我该如何正确地做到这一点?

我用来搜索的代码来自这个答案

为什么使用row.Cells [row.Index]。 您需要指定要搜索的列的索引(问题#2)。 例如,您需要将row.Cells [row.Index]更改为row.Cells [2],其中2是列的索引:

 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); } } 

为什么不首先构建DataTable然后将其作为DataSource分配给DataGridView

 DataTable table4DataSource=new DataTable(); table4DataSource.Columns.Add("col00"); table4DataSource.Columns.Add("col01"); table4DataSource.Columns.Add("col02"); ... 

(手动,循环或通过数据库表中的DataReader添加行)(分配数据源)

 dtGrdViewGrid.DataSource = table4DataSource; 

然后使用:

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

您甚至可以将这段代码放在textbox_textchange事件中,并在编写时显示过滤后的值。

 // 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); } } 

直接从DataTableDataset过滤Dataset

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

Textbox事件KeyUp上使用此代码,为表名或数据集替换“MyTable”,替换您要进行搜索的字段。

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

如何与数据库连接和Datatable建立关系? 我应该如何设置DefaultView正确?

我使用此代码来获取数据:

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

最好还是在另一个方法中分离逻辑,或者在另一个类中分离逻辑。

此方法将帮助您检索找到文本的DataGridViewCell对象。

  ///  /// 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(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 } }