我有两个DataGridview
,dgvProducts
和dgvCart
。
当我将产品从dgvProducts
转移到dgvCart
时,指定的数量将从第一个数据网格视图中扣除。
但问题是我的文本框搜索代码,它正在使用查询,因此即使事务未完成,每次都会重置datagridview数量。
这是搜索文本框的代码。
private void textOrderSearch_TextChanged(object sender, EventArgs e)
{
if (textOrderSearch.Text != "")
{
crud.FillDataGrid("Select ProductID,BrandName,GenericName,Form,Dosage,Quantity,SellingPrice,D,VE from Products where Status = 'Active' and Quantity > 0 and (ProductID Like '%" + textOrderSearch.Text + "%' or BrandName Like '%" + textOrderSearch.Text + "%' or GenericName Like '%" + textOrderSearch.Text + "%' or Form Like '%" + textOrderSearch.Text + "%' or Dosage Like '%" + textOrderSearch.Text + "%' ) ", ref dgvPOSproduct);
dgvPOSproduct.Columns[0].HeaderText = "ProductID";
dgvPOSproduct.Columns[1].HeaderText = "Brand";
dgvPOSproduct.Columns[2].HeaderText = "Generic";
dgvPOSproduct.Columns[3].HeaderText = "Form";
dgvPOSproduct.Columns[4].HeaderText = "Dosage";
dgvPOSproduct.Columns[5].HeaderText = "Qty";
dgvPOSproduct.Columns[6].HeaderText = "Price";
dgvPOSproduct.Columns[7].HeaderText = "D";
dgvPOSproduct.Columns[8].HeaderText = "VE";
dgvPOSproduct.Columns[0].Width = 65;
dgvPOSproduct.Columns[1].Width = 80;
dgvPOSproduct.Columns[2].Width = 80;
dgvPOSproduct.Columns[3].Width = 58;
dgvPOSproduct.Columns[4].Width = 58;
dgvPOSproduct.Columns[5].Width = 45;
dgvPOSproduct.Columns[6].Width = 55;
dgvPOSproduct.Columns[7].Width = 35;
dgvPOSproduct.Columns[8].Width = 35;
}
else
{
dgvProductSettings();
}
}
填充datagridview的方法的代码。
private void dgvProductSettings()
{
crud.FillDataGrid("Select ProductID,BrandName,GenericName,Form,Dosage,Quantity,SellingPrice,D,VE from Products where Status = 'Active' and Quantity > 0", ref dgvPOSproduct);
dgvPOSproduct.Columns[0].HeaderText = "ProductID";
dgvPOSproduct.Columns[1].HeaderText = "Brand";
dgvPOSproduct.Columns[2].HeaderText = "Generic";
dgvPOSproduct.Columns[3].HeaderText = "Form";
dgvPOSproduct.Columns[4].HeaderText = "Dosage";
dgvPOSproduct.Columns[5].HeaderText = "Qty";
dgvPOSproduct.Columns[6].HeaderText = "Price";
dgvPOSproduct.Columns[7].HeaderText = "D";
dgvPOSproduct.Columns[8].HeaderText = "VE";
dgvPOSproduct.Columns[0].Width = 65;
dgvPOSproduct.Columns[1].Width = 80;
dgvPOSproduct.Columns[2].Width = 80;
dgvPOSproduct.Columns[3].Width = 58;
dgvPOSproduct.Columns[4].Width = 58;
dgvPOSproduct.Columns[5].Width = 45;
dgvPOSproduct.Columns[6].Width = 55;
dgvPOSproduct.Columns[7].Width = 35;
dgvPOSproduct.Columns[8].Width = 35;
}
有没有办法只搜索datagridview,这样每次进行搜索时都不需要重新调整数量的查询?谢谢。
编辑:添加了crud方法
public crud()
{
cnString = "Data Source=BENJOPC\\SQLEXPRESS;Initial Catalog=MARISCHELLdatabase;Integrated Security=True";
cn = new SqlConnection(cnString);
}
public void FillDataGrid(string sql, ref ns1.BunifuCustomDataGrid dg)
{
try
{
DataSet ds = new DataSet();
cn.Open();
cmd = new SqlCommand(sql, cn);
adptr = new SqlDataAdapter(cmd);
adptr.Fill(ds);
dg.DataSource = "";
dg.DataSource = ds.Tables[0];
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
cn.Close();
}
答案 0 :(得分:1)
是的,有。您可以循环遍历行并设置不需要的内容:
Me.dgwList.Rows(0).Visible = False
但是,我会强烈建议以避免它。 更好的方法是将数据集存储到Datatable1中,如:
' define those as *global* variables (outside subs and functions)
Dim dtMyTable1 as New Datatable
Dim dtMyTable2 as New Datatable
' Load your data from database into first dtMyTable and assign it to DGW
' instead of datasource
dtMyTable1 = ds.tables(0)
Me.dgwList.datasource = dtMyTable1
如果您需要在每次用户点击列表时更新第二个DGW列表,那么您可以将数据操作到DataTable2中,如:
Private Sub UpdateSelection()
For ir = 0 to me.dtMyTable.Rows.Count - 1
Dim dr as datagridviewRow = me.dtMyTable.Rows(ir)
If dr("Brand") = BrandString Then
dtMyTable2.ImportRow(dtMyTable.Item(I).Row)
End If
Next ir
End Sub
但要创建一个列表以添加每个下一个选定的值,请调用此函数:
Private Sub AddSelectedRowToSelection()
If Me.dgwList.SelectedRows.Count > 0 Then ' only if a row is selected
' add this row
dtMyTable2.ImportRow(dtMyTable.Item(Me.dgwList.SelectedRows(0).Index).Row)
End If
End Sub
然后将第二个db作为数据源放入第二个DataGridView:
Me.SeconddgwList.datasource = dtMyTable2
您可以清空第二个列表(删除行但保留列),如下所示:
dtMyTable2.Clear()
编辑2:啊,我看到你正在使用它从第一个DataGridView收集行。然后它更简单,如上所述,但始终将第一个表设置为第一个datagridview的数据源,将第二个表设置为第二个DataGridView的源。并且不要删除旧行,将它们保留在第二组中。
编辑:抱歉,C#应该是这样的:
this.dgwList.Rows(0).Visible == false
Datatable dtMyTable = new Datatable();
Datatable dtMyTable2 = new Datatable();
dtMyTable = ds.tables(0);
for (ir = 0; ir <= this.dtMyTable.Rows.Count - 1; ir++) {
datagridviewRow dr = this.dtMyTable.Rows(ir);
if (dr("Brand") == BrandString) {
dtMyTable2.ImportRow(dtMyTable.Item(I).Row);
}
}
private void AddSelectedRowToSelection()
{
// only if a row is selected
if (this.dgwList.SelectedRows.Count > 0) {
// add this row
dtMyTable2.ImportRow(dtMyTable.Item(this.dgwList.SelectedRows(0).Index).Row);
}
}
this.dgwList.datasource = dtMyTable2;
答案 1 :(得分:0)
我设法在这里解决我的问题是我使用的代码。
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, Form, Dosage, Quantity, SellingPrice, D, VE from Products where Status = 'Active' and Quantity > 0", cnn))
{
da.Fill(dt);
dgvPOSproduct.DataSource = dt;
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
和
private void textOrderSearch_TextChanged(object sender, EventArgs e)
{
DataView dv = dt.DefaultView;
dv.RowFilter = string.Format("BrandName like '%{0}%' ", textOrderSearch.Text);
dgvPOSproduct.DataSource = dt;
dgvPOSproduct.Columns[0].HeaderText = "ProductID";
dgvPOSproduct.Columns[1].HeaderText = "Brand";
dgvPOSproduct.Columns[2].HeaderText = "Generic";
dgvPOSproduct.Columns[3].HeaderText = "Form";
dgvPOSproduct.Columns[4].HeaderText = "Dosage";
dgvPOSproduct.Columns[5].HeaderText = "Qty";
dgvPOSproduct.Columns[6].HeaderText = "Price";
dgvPOSproduct.Columns[7].HeaderText = "D";
dgvPOSproduct.Columns[8].HeaderText = "VE";
dgvPOSproduct.Columns[0].Width = 65;
dgvPOSproduct.Columns[1].Width = 80;
dgvPOSproduct.Columns[2].Width = 80;
dgvPOSproduct.Columns[3].Width = 58;
dgvPOSproduct.Columns[4].Width = 58;
dgvPOSproduct.Columns[5].Width = 45;
dgvPOSproduct.Columns[6].Width = 55;
dgvPOSproduct.Columns[7].Width = 35;
dgvPOSproduct.Columns[8].Width = 35;
}