C#Winforms。按下清除按钮时,Textchanged事件将停止工作

时间:2017-09-16 10:47:21

标签: c# winforms datagridview datatable

您好我有一个POS系统,它有两个datagridview,当我扫描条形码时,产品会通过textchanged事件自动添加到购物车datagridview。

工作正常但是当我点击“清除按钮”时,textchanged事件将停止工作。感谢您的任何想法。

清除按钮代码:

  private void btnClearcart_Click(object sender, EventArgs e)
    {
        dgvPOScart.Rows.Clear();
        dgvPOScart.Refresh();

        if (dgvPOSproduct.Rows.Count > 0)
        {
            dgvPOSproduct.DataSource = null;
        }

            DataTable dt = new DataTable("Products");

            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnn"].ConnectionString))
            {
                if (cnn.State == ConnectionState.Closed)
                    cnn.Open();
                using (SqlDataAdapter da = new SqlDataAdapter("Select ProductID, BrandName, GenericName, Quantity, SellingPrice, Dosage, Form, S,P, VE ,  Barcode , Category , Description from Products where Status = 'Active' and Quantity > 0", cnn))
                {
                    da.Fill(dt);
                    dgvPOSproduct.DataSource = dt;
                    productwidth();

                }
            }

    }

在表单加载中填充产品datagridview的代码:

  DataTable dt = new DataTable("Products");

    private void dgvProductNew()
    {
        try
        {
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnn"].ConnectionString))
            {
                if (cnn.State == ConnectionState.Closed)
                    cnn.Open();
                using (SqlDataAdapter da = new SqlDataAdapter("Select ProductID, BrandName, GenericName, Quantity, SellingPrice, Dosage, Form, S,P, VE ,  Barcode , Category , Description from Products where Status = 'Active' and Quantity > 0", cnn))
                {
                    da.Fill(dt);
                    dgvPOSproduct.DataSource = dt;

                    productwidth();

                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

textchanged事件代码:

    private void txtBarcodeSearch_TextChanged(object sender, EventArgs e)
    {
        DataView dv = dt.DefaultView;
        selectedRow = null;

        dv.RowFilter = string.Format("Barcode like '{0}%' ", txtBarcodeSearch.Text);
        productwidth();

        if (txtBarcodeSearch.Text.Length == 13)
        {

            if (dgvPOSproduct.Rows.Count == 1)
            {
                selectedRow = 0;
            }

            if (selectedRow.HasValue)
            {
                addcartbarcode();
                txtBarcodeSearch.Clear();
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

您是否已检查过将调试器放在TextChanged事件上?因为它必须在更改文本框的文本时触发。

所以,我认为这不是你的问题。

但如果我没有错,以下可能是你的问题。

您的txtBarcodeSearch_TextChanged事件始终会触发,行过滤器也会根据需要过滤行,但不会过滤相同的DataTable对象,即dt。 这意味着您没有过滤相同的数据表对象。因为当你点击清除按钮时,你已经在btnClearcart_Click事件中两次声明了dt对象,一个是公共的,另一个是私有的

private void btnClearcart_Click(object sender, EventArgs e)
{
    dgvPOScart.Rows.Clear();
    dgvPOScart.Refresh();

    if (dgvPOSproduct.Rows.Count > 0)
    {
        dgvPOSproduct.DataSource = null;
    }

        //DataTable dt = new DataTable("Products");  //this was your issue
        dt = new DataTable("Products");            //this will work

        using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnn"].ConnectionString))
        {
            if (cnn.State == ConnectionState.Closed)
                cnn.Open();
            using (SqlDataAdapter da = new SqlDataAdapter("Select ProductID, BrandName, GenericName, Quantity, SellingPrice, Dosage, Form, S,P, VE ,  Barcode , Category , Description from Products where Status = 'Active' and Quantity > 0", cnn))
            {
                da.Fill(dt);
                dgvPOSproduct.DataSource = dt;
                productwidth();

            }
        }

}

因此,在单击清除按钮后,每次单击“清除”按钮时,datagridview都会绑定到新的数据表实例。但是你的textchage事件只过滤了第一个dt对象(datatable),它不再绑定到datagridview。