2012-05-31 30 views
-1

問題:排序經濾波的GridView

我想允許分選(ASC/DESC)和過濾在我的GridView。

我已經設法通過我的GridView上的DropDownListDataBound字段實現了這兩個字段。但是,當用戶從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(); 
} 

我試着調用過濾代碼/當我做我的排序這將有道理,但同樣的事情發生後。我一直在google搜索了大約2個小時,並找不到解決方案。

有沒有人遇到過這個問題?你能提供一個潛在的解決方案或一些指導嗎?

三江源

+1

Downvoter care to comment? – dtsg

回答

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

你在SortGridView查詢(..)方法沒有考慮到DDL值。你應該打電話給你FilterGridView(..)方法OnSorting事件或類似(稱之爲BindGrid()爲例)

+0

我嘗試過在排序時調用'FilterGridView',但無效:( – dtsg

+0

您需要更改您的FilterGridView()方法。但房間裏的大象是您的查詢:「SELECT * FROM Products ORDER BY ... 「你需要對此進行排序 – lekso

1

你應該有一個「圖層」方法來取回適當的數據,而不是有一個無效的方法FilterGridView。它應該返回一個正確填充的DataSet或Collection對象,而不是直接分配數據源。這樣,您的檢索方法將設置必要的任何過濾和/或分類條件。如果需要,這樣它接受的參數和使用重載默認的「空」值,你可以建立它

gvAllProducts.DataSource = GetFilteredSortedData(); 

:然後在動作方法,你能指定。

+0

我已經修復了它,但是我確實喜歡這個想法,現在很亂。 – dtsg