根据文本框对数据表的内容进行排序

时间:2019-01-25 08:20:45

标签: c# datagridview

我想通过在文本框中输入要查找的值来选择DataGridView的行。另外,我希望将最相同的值集中在/选定上。 我已经尝试使用rowfilter函数,该函数给了我:

(dgv_DetailComptes.DataSource as DataTable).DefaultView.RowFilter = string.Format("Champ LIKE '%{0}%'", tbx_champ_Cpt.Text);

但是,它过滤行,这意味着当其他行的内容不是我要查找的行时,其他行就会消失。我想将行保留在表中,然后选择包含要查找的值的行。
另外,我的DGV从数据表中获取行/列/值,因此可能阻止我使用DataGridView的行索引来搜索包含值的行。

有没有办法选择我的行? 谢谢您的回答。

1 个答案:

答案 0 :(得分:0)

最后我设法找到了,也许做了一些我不知道的无用的事情。 这是代码:

        private void tbx_champ_Cpt_TextChanged(object sender, EventArgs e)
    {
        if (tbx_champ_Cpt.Text.ToString() == "")
        {
            for (int i = 0; i < dgv_DetailComptes.Rows.Count - 1; i++)
            {
                dgv_DetailComptes.Rows[i].Selected = false;
            }
        }
        else
        {
            tbx_champ_Cpt.SelectionStart = tbx_champ_Cpt.Text.Length;
            tbx_champ_Cpt.Text = tbx_champ_Cpt.Text.ToString().ToUpper();
            DataTable d = (DataTable)dgv_DetailComptes.DataSource;
            String text = tbx_champ_Cpt.Text.ToString();
            DataRow[] row = d.Select("Champ like '%" + text + "%'");
            List<int> listeIndex = new List<int>();
            for (int i = 0; i < dgv_DetailComptes.Rows.Count - 1; i++)
            {
                foreach (DataRow r in row)
                {
                    if (((DataRowView)dgv_DetailComptes.Rows[i].DataBoundItem).Row == r)
                    {
                        dgv_DetailComptes.Rows[i].Selected = true;
                        listeIndex.Add(i);
                    }
                    else if (!listeIndex.Contains(i))
                    {
                        dgv_DetailComptes.Rows[i].Selected = false;
                    }
                }

            }
        }
        if (dgv_DetailComptes.SelectedRows.Count != 0)
        {
        dgv_DetailComptes.FirstDisplayedScrollingRowIndex = dgv_DetailComptes.SelectedRows[0].Index;
        }
    }