2017-08-21 122 views
0

我有兩個DataGridview's,dgvProductsdgvCart。 當我將產品從dgvProducts轉移到dgvCart時,指定的數量將從第一個datagridview中扣除。在不進行sql查詢的情況下搜索datagridview

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?謝謝。

編輯:加入污物方法

 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(); 
    } 

回答

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 

如果你需要更新第二D-GW的每次用戶點擊列表中的列表,然後你會和處理數據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 

,然後把第二個分貝到第二DataGridView中爲d atasource:

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; 
+0

謝謝回覆先生。我應該把這個放在哪裏?順便說一句,我加了我的crud.filldatagrid方法。 – StudentDev

+0

我會修改我的答案來引導你... –

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