过滤网格视图时,无法绑定到没有名称错误的数据表

我有一个datagridview和5个ComboBoxes ,我试图用ComboBox的文本值过滤网格的行。 网格填充存储过程取决于FormLoad事件中的某些条件。 我应该在btn_filter点击事件中再次填写吗?

无论如何,这个exception都在下面的代码中捕获: 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); } 

尝试明确指定名称。 在创建数据视图之前使用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中的值重新加载网格,您可以将现有数据源转换为DataView,如下所示:

 (dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter 

阅读这个问题的更多内容

谢谢用户1792936,你实现的方式是正确的但有一个更简单的方法: 根据这个链接和布拉德布鲁斯的答案

我不需要再次填充网格:

 (dgv.DataSource as DataTable).DefaultView.RowFilter = filterStr;