搜索datagridview而不进行SQL查询

时间:2017-08-21 13:43:59

标签: c# sql datagridview

我有两个DataGridviewdgvProductsdgvCart。 当我将产品从dgvProducts转移到dgvCart时,指定的数量将从第一个数据网格视图中扣除。

pic 1

pic 2

但问题是我的文本框搜索代码,它正在使用查询,因此即使事务未完成,每次都会重置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();
    }

2 个答案:

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