一列中搜索值的DataGridView(Search for value in DataGridVi

2019-07-03 11:48发布

我希望用户能够在DataGridView中(DGV)一栏来搜索数量。 该DGV可以容纳多条记录。 每个记录有一个项目编号。 所以,我希望用户能够搜索在列项目编号项目数量。 我的列有:专案编号(不可见); 图像(无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:我认为这是可以以更好的方式来完成,通过仅列项目名称搜索值。 但如何我应该这样做是否正确?

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

Answer 1:

为什么你正在使用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);
    }
}


Answer 2:

这是更好也是你的逻辑在另一种方法在另一个类分开,或者可能。

此方法将帮助您retreive其中文本被发现的DataGridViewCell对象。

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


Answer 3:

你为什么不建立一个DataTable第一然后将其分配到DataGridViewDataSource

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事件和您的过滤值将显示为你写的。



Answer 4:

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


Answer 5:

直接从过滤数据DataTableDataset

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

使用事件这段代码KeyUpTextbox ,将“MyTable的”为你的表名或数据集,取代对您想要使搜索领域。



Answer 6:

“MyTable的” .DefaultView.RowFilter = “LIKE '%” + textBox1.Text + “%'”; this.dataGridView1.DataSource = “MyTable的” .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();


文章来源: Search for value in DataGridView in a column