2012-11-12 9 views
0

我有一個datagridview和5 ComboBoxes,我想用ComboBox的文本值過濾網格的行。網格被填充存儲過程取決於FormLoad事件中的一些條件。我應該在btn_filter點擊事件中再次填充它嗎?無法綁定到數據表,沒有名稱錯誤,同時過濾gridview

反正這個例外是在下面的代碼逮住:cannot bind to datatable with no name.

這裏是btn_filter代碼:

private void btnFilter_Click(object sender, EventArgs e) 
    { 
     String filterStr = ""; 

     if (cmbGrp.Text.Trim() != String.Empty) 
      filterStr += "group ='" + cmbGrp.Text.Trim() + "' and"; 
     if(cmbMdl.Text.Trim() != String.Empty) 
      filterStr += " model ='" + cmbMdl.Text.Trim() + "' and"; 
     if (cmbTrh.Text.Trim() != String.Empty) 
      filterStr += " tarh ='" + cmbTrh.Text.Trim() + "' and"; 
     if (cmbSiz.Text.Trim() != String.Empty) 
      filterStr += " size ='" + cmbSiz.Text.Trim() + "' and"; 
     if (cmbClr.Text.Trim() != String.Empty) 
      filterStr += " color ='" + cmbClr.Text.Trim() + "'";    

     if (filterStr.LastIndexOf("and") == filterStr.Length - 3) 
      filterStr = filterStr.Remove(filterStr.Length-3,3); 


     DataView view = new DataView(); 
     if (condition1) 
      view.Table = Production.usp1(txtProdCode.Text); 
     else if (condition2) 
      view.Table = Production.usp2(); 
     else 
      return; 
     view.RowFilter = filterStr; 
     dgv.DataSource = view;  
    } 

這裏是StoredProcedure的相關功能(在Production類):

public static DataTable usp2() 
    { 
     SqlCommand cmd = new SqlCommand("usp2"); 
     return callProc(cmd); 
    } 

    public static DataTable usp1(String prod_code) 
    { 
     SqlCommand cmd = new SqlCommand("usp1"); 
     cmd.Parameters.Add(new SqlParameter("@prod_code", prod_code)); 
     return callProc(cmd); 
    } 

回答

1

嘗試明確指定名稱。在創建數據視圖之前使用DataTable.TableName="Name"
您btnFilter_Click方法應該是這樣的:

private void btnFilter_Click(object sender, EventArgs e) 
    { 
     String filterStr = ""; 

     filterStr +=  "grp_name " + (cmbGrp.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbGrp.Text.Trim()) + "'"; 
     filterStr += " and mdl_name " + (cmbMdl.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbMdl.Text.Trim()) + "'"; 
     filterStr += " and trh_name " + (cmbTrh.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbTrh.Text.Trim()) + "'"; 
     filterStr += " and siz_name " + (cmbSiz.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbSiz.Text.Trim()) + "'"; 
     filterStr += " and clr_name " + (cmbClr.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbClr.Text.Trim()) + "'"; 

     DataView view = new DataView(); 

     if (condition1) 
      { 
      var dt = Production.usp1(txtProdCode.Text); 
      dt.TableName="usp1"; 
      view.Table = dt; 
      } 
     else if (condition2) 
      { 
      var dt = Production.usp2(); 
      dt.TableName="usp2"; 
      view.Table = dt; 
      } 
     else 
      return; 
     view.RowFilter = filterStr; 
     dgv.DataSource = view;  
    } 

爲了不重裝電網從DB值再次,你可以投你現有的數據源數據視圖這樣的:

(dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter 

詳情請閱讀this question

+0

是有沒有再次填充網格的方式,過濾器之前?我正在使用這個類型:'DataTable dt =(DataTable)dgv.DataSource;' – rene

+0

@rene,是的,你可以按照你在這個評論中顯示的方式來做。你可以將你的數據源轉換爲數據視圖,進行過濾並再次調用DataBind。在這裏閱讀更多:http://stackoverflow.com/questions/5843537/filtering-datagridview-without-changing-datasource – RAS

+0

感謝您的鏈接,我找到了一個更簡單的答案! – rene

相關問題