-1

問題:

GridViewでの並べ替え(ASC / DESC)とフィルタリングを許可したいのですが。

DropDownListのaフィールドとDataBoundフィールドの両方を介して実装することができましたGridView。ただし、ユーザーがDropDownListからフィルターを選択し、結果のデータを並べ替えようとすると、GridViewは現在選択されているフィルターを「忘れて」、期待どおりにフィルター処理されたデータではなく、すべてのデータを並べ替えます。

私が試したこと:

これが私のフィルタリングコードです...

private void FilterGridView()
{
     SqlCommand command = new SqlCommand();
     SqlConnection connection = new SqlConnection();
     connection.ConnectionString = WebConfigurationManager.ConnectionStrings[1].ConnectionString;

     command.CommandText = string.Format("SELECT * FROM Products WHERE {0} = 1", ddlProdFilter.SelectedValue);

     if (ddlProdFilter.SelectedValue == "on_sale")
     {
            command.CommandText = "SELECT * FROM Products INNER JOIN ProductVariants ON [Products].product_id = [ProductVariants].product_id WHERE [ProductVariants].on_sale = 1";
     }
     else if (ddlProdFilter.SelectedValue == "*")
     {
            command.CommandText = "SELECT * FROM Products";
     }

     command.Connection = connection;

     SqlDataAdapter sqlAdapter = new SqlDataAdapter(command);
     DataSet ds = new DataSet();

     sqlAdapter.Fill(ds);

     if (ds.Tables[0].Rows.Count == 0)
     {
          pnlNoProducts.Visible = true;
     }
     else
     {
          pnlNoProducts.Visible = false;
     }

     gvAllProducts.DataSource = ds;
}

ドロップダウンリストで選択された値は、テーブルの列名に対応しています。

これが私のソートコードです...

private void SortGridView(string sortExpression, string sortDir)
{
     SqlCommand command = new SqlCommand();
     SqlConnection connection = new SqlConnection();
     connection.ConnectionString = WebConfigurationManager.ConnectionStrings[1].ConnectionString;

     if (!string.IsNullOrEmpty(sortDir))
     {
         command.CommandText = "SELECT * FROM Products ORDER BY " + sortExpression + " " + sortDir;
     }

     command.Connection = connection;

     SqlDataAdapter sqlAdapter = new SqlDataAdapter(command);
     DataSet ds = new DataSet();
     sqlAdapter.Fill(ds);

     DataTable dt = new DataTable();

     dt = ds.Tables[0];

     gvAllProducts.DataSource = dt;
}

sortExpressionが選択されたフィールドに対応する場合、DataBoundたとえばproduct_id、そして最後に、sortDirポストバック間のソート順を正確に追跡するために使用されるセッション変数です。

イベントハンドラー。

protected void gvAllProducts_OnSorting(object sender, GridViewSortEventArgs e)
{
     if (e.SortDirection == SortDirection.Ascending && SessionHelper.GetSessionStringValue("SORT_DIRECTION") != "DESC")//if ascending and the last sort order wasn't descending, sort by DSC
     {
         SessionHelper.SetSessionValue("DESC", "SORT_DIRECTION");
     }
     else if (SessionHelper.GetSessionStringValue("SORT_DIRECTION") == "DESC")//otherwise, if the last sort order was desc, sort asc
     {
         SessionHelper.SetSessionValue("ASC", "SORT_DIRECTION");
     }

     SortGridView(e.SortExpression, SessionHelper.GetSessionStringValue("SORT_DIRECTION"));
     BindDataSource();
     e.Cancel = true;
}

protected void ddlProdFilter_SelectedIndexChanged(object sender, EventArgs e)
{
     FilterGridView();
     BindDataSource();
}

protected void gvAllProducts_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
     gvAllProducts.PageIndex = e.NewPageIndex;
     FilterGridView();
     BindDataSource();
}

ソートを実行するとき/実行した後にフィルタリングコードを呼び出そうとしましたが、これは理にかなっていますが、同じことが起こります。私は約2時間グーグルしていて、これに対する解決策を見つけることができません。

誰かが以前にこの問題に直面したことがありますか?ここで潜在的な解決策またはいくつかのガイダンスを提供できますか?

ありがとうございました

4

3 に答える 3

2

ソートクエリに ddl 値を含めることで、なんとか機能させることができました:

 private void SortGridView(string sortExpression, string sortDir, string filter)
        {
            SqlCommand command = new SqlCommand();
            SqlConnection connection = new SqlConnection();
            connection.ConnectionString = WebConfigurationManager.ConnectionStrings[1].ConnectionString;

            if (filter == "*")
            {
                command.CommandText = "SELECT * FROM Products ORDER BY " + sortExpression + " " + sortDir;
            }
            else if (filter == "on_sale")
            {
                command.CommandText = "SELECT * FROM Products INNER JOIN ProductVariants ON [Products].product_id = [ProductVariants].product_id WHERE [ProductVariants].on_sale = 1 ORDER BY [Products]." + sortExpression + " " + sortDir;
            }
            else
            {
                command.CommandText = "SELECT * FROM Products WHERE " + filter + " = 1 ORDER BY " + sortExpression + " " + sortDir;
            }

            command.Connection = connection;

            SqlDataAdapter sqlAdapter = new SqlDataAdapter(command);
            DataSet ds = new DataSet();
            sqlAdapter.Fill(ds);

            DataTable dt = new DataTable();

            dt = ds.Tables[0];

            gvAllProducts.DataSource = dt;
        }
于 2012-05-31T11:01:05.103 に答える
1

SortGridView(..) メソッドのクエリは、ddl 値を考慮していません。FilterGridView(..) メソッドの OnSorting イベントなどを呼び出す必要があります (たとえば、BindGrid() と呼びます)。

于 2012-05-31T10:55:35.167 に答える
1

void メソッドを使用する代わりにFilterGridView、適切なデータを取得する「レイヤー」メソッドを使用する必要があります。データ ソースを直接割り当てるのではなく、適切に入力された DataSet または Collection オブジェクトを返す必要があります。このように、取得方法は、必要なフィルタリングおよび/または並べ替えの条件を設定します。次に、アクション メソッドで次のように指定します。

 gvAllProducts.DataSource = GetFilteredSortedData();

必要に応じて、パラメーターを受け入れ、デフォルトの「空の」値にオーバーロードを使用するようにビルドできます。

于 2012-05-31T11:03:25.530 に答える