您好我有一个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();
}
}
}
答案 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。