0

datagridviewと 5がComboBoxesあり、ComboBox のテキスト値でグリッドの行をフィルタリングしようとしています。グリッドは、イベントのいくつかの条件に応じてストアド プロシージャで満たされますFormLoadbtn_filterクリックイベントでもう一度入力する必要がありますか?

とにかく、この例外は以下のコードでキャッチされます。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);
    }
4

2 に答える 2

2

名前を明示的に指定してみてください。データビューを作成する前に使用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  

この質問の詳細を読む

于 2012-11-12T21:42:52.993 に答える
0

ありがとうuser1792936、あなたが実装した方法は正しいですが、より簡単な方法があります:このリンクとBrad Bruceの回答によると

グリッドを再度埋める必要はありません。

(dgv.DataSource as DataTable).DefaultView.RowFilter = filterStr;
于 2012-11-12T22:46:56.237 に答える