Как правильно использовать RowFilter в DataGridView, заполненном DataTable? - PullRequest
0 голосов
/ 24 января 2020

Я использовал метод из этого поста , чтобы выполнить поиск в datagridview

Ниже приведена моя попытка. Я хотел бы прекратить запрашивать базу данных с помощью метода DgvSearch () при изменении текста, вместо этого использовать RowFilter.

При текущей попытке datagridview правильно заполняется из LoadDataParts (), когда я начинаю вводить в TxtPP_GBC2, я вижу только столбец заголовок, исключение не выдается.

ГБ C столбец определен как "INT".

Ожидаемый результат -> TxtPP_GBC2_TextChanged () будет вести себя так же, как DgvSearch ()

public partial class ProgramPart : Form
{
    public SqlConnection Con { get; } = new SqlConnection(@"***");
    public  string UserDBO;
    private DataTable dataTable = new DataTable();
    public ProgramPart()
    {
        InitializeComponent();
        LoadDataParts();
    }
    public void LoadDataParts()
    {
        string sql3 = "SELECT * FROM Parts";

        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql3, Con);
        sqlDataAdapter.Fill(dataTable);
        sqlDataAdapter.Dispose();
        dataGridView1n.DataSource = dataTable;
    }

    private void TxtPP_GBC2_TextChanged(object sender, EventArgs e)
    {
        //DgvSearch(); //////// DgvSearch() works perferctly
        try
        {
            if(txtPP_GBC2.Text == "")
            {
                dataTable.Clear();
                LoadDataParts();
                dataGridView1n.Refresh();
                return;
            }
            (dataGridView1n.DataSource as DataTable).DefaultView.RowFilter = "GBC = '" + Convert.ToInt32(txtPP_GBC2.Text) + "'";
            dataGridView1n.Refresh();
        }
        catch(Exception s)
        {
            MessageBox.Show(s.ToString());
        }
    }

    private void DgvSearch()
    {
        string sql3 = "SELECT * FROM Parts WHERE GBC LIKE @GBC2 AND Description LIKE @DES";
        Con.Open();
        SqlDataAdapter da = new SqlDataAdapter(sql3, Con);
        da.SelectCommand.Parameters.AddWithValue("@GBC2", SqlDbType.Int).Value = "%" + txtPP_GBC2.Text + "%";
        da.SelectCommand.Parameters.AddWithValue("@DES", SqlDbType.VarChar).Value = "%" + txtPP_Description2.Text + "%";

        DataSet ds = new DataSet();
        da.Fill(ds, "Parts");
        da.Dispose();
        dataGridView1n.DataSource = ds;
        dataGridView1n.DataMember = "Parts";
        Con.Close();


  }
}

1 Ответ

1 голос
/ 24 января 2020

Вы можете использовать функцию выражения Convert, чтобы преобразовать значение столбца int в строку и сравнить его, используя такой фильтр:

private DataTable LoadData()
{
    var dt = new DataTable();
    dt.Columns.Add("C1", typeof(int));
    dt.Rows.Add(1);
    dt.Rows.Add(11);
    dt.Rows.Add(2);
    dt.Rows.Add(22);
    return dt;       
}
private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = LoadData();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
    var filter = "";
    if (!string.IsNullOrEmpty(textBox1.Text))
        filter = $"Convert([C1], System.String) = '{textBox1.Text}'";
    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = filter;
}

Если по какой-либо причине вы предпочитаете оператор LIKE, вам нужно изменить фильтр на:

filter = $"Convert([C1], System.String) LIKE '%{textBox1.Text}%'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...