首页 > 解决方案 > 根据 TextBox 对 DataTable 的内容进行排序

问题描述

我想通过将我要查找的值放入文本框中来选择我的 DataGridView 的行。我也希望关注/选择最相同的值。
我已经尝试过使用 rowfilter 函数,它给了我这个:

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

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

有没有办法以这种方式选择我的行?谢谢您的回答。

标签: c#datagridview

解决方案


最后我设法找到,做一些我不知道的无用的东西。这是代码:

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

推荐阅读