2011-09-28 53 views
2
使用的列標題在LayoutTemplate模板

asp.net的ListView使用的DataBind排序

我能夠使用ASP排序基本列表視圖

排序列表視圖:SqlDataSource和設置列表視圖屬性的DataSourceID通過將其指向ASP :SqlDataSource標識。我在排序時沒有使用asp:SqlDataSource,而只是從後面的代碼中獲取DataBinding。

的SqlDataSource示例:

<asp:ListView ID="ContactsListView" DataSourceID="ContactsDataSource" runat="server"> 
    <LayoutTemplate> 
     <table width="640px" runat="server"> 
      <tr class="header" align="center" runat="server"> 
       <td> 
        <asp:LinkButton runat="server" ID="SortByFirstNameButton" CommandName="Sort" Text="First Name" CommandArgument="FirstName" /> 
    </LayoutTemplate> 
    .... 
</asp:ListView> 

<asp:SqlDataSource ID="ContactsDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:MainConnString %>" 
    SelectCommand="SELECT * FROM TableName"> 
</asp:SqlDataSource> 

的DataBind實施例:

<asp:ListView ID="ContactsListView" DataSourceID="ContactsDataSource" runat="server"> 
    <LayoutTemplate> 
     <table width="640px" runat="server"> 
      <tr class="header" align="center" runat="server"> 
       <td> 
        <asp:LinkButton runat="server" ID="SortByFirstNameButton" CommandName="Sort" Text="First Name" CommandArgument="FirstName" /> 
    </LayoutTemplate> 
    .... 
</asp:ListView> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    String SQL = "SELECT * FROM Customer"; 
    SqlDataAdapter da= new SqlDataAdapter(SQL, ConnStr); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 

    ContactsListView.DataSource = ds.Tables[0]; 
    ContactsListView.DataBind(); 
} 

兩個代碼樣品填充列表視圖,但第二實施例的數據綁定用於排序不起作用。在第一個例子中,排序只需要在LayoutTemplate中添加asp:LinkBut​​ton,添加CommandName =「sort」並設置CommandArugment =「ColumnName」,但它不適用於第二個示例。

任何人都可以請解釋爲什麼以及如何使用DataBind方法後面的代碼進行排序工作嗎?

謝謝!

+0

有沒有在你的代碼來處理排序 - 你是怎麼嘗試導致了問題?您可以爲SQL查詢添加一個ORDER BY子句,或者添加一些代碼隱藏功能將其排序在數據綁定上 - 這取決於您想實現的目標;讓我們知道。 – Widor

+0

這兩個示例都會填充列表視圖,但在第一個示例中,我不必添加任何其他代碼即可在單擊列標題時使排序工作。 – PsychoDUCK

+0

我想出了我的解決方案,並將在今晚晚些時候發佈。我的聲譽不會讓我發佈,直到8小時後。 基本上如下面的答案建議,我必須創建我自己的OnSort事件處理程序,重新查詢數據庫到DataTable中,對DataTable進行排序然後將其綁定回ListView。 如果有一種方式可以不必再打電話給數據庫,請告訴我。 – PsychoDUCK

回答

8

我解決了我的問題。

我添加了一個事件來處理排序。該事件獲取命令名稱(Data列)並將它和排序方向傳遞給一個函數,該函數將對數據庫進行另一次調用,將返回的結果進行排序並重新綁定到列表視圖。

我不得不創建一個視圖狀態來保存列表視圖排序方向,因爲由於某種原因,onsorting事件處理程序不斷說排序方向是升序。

前端

<asp:ListView ID="ContactsListView" OnSorting="ContactsListView_Sorting" runat="server"> 
    <LayoutTemplate> 
     <table width="640px" runat="server"> 
      <tr class="header" align="center" runat="server"> 
       <td> 
        <asp:LinkButton runat="server" ID="SortByFirstNameButton" CommandName="Sort" Text="First Name" CommandArgument="FirstName" /> 
    </LayoutTemplate> 
    .... 
</asp:ListView> 

後端

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     BindContacts(string.Empty); 
    } 
} 

protected SortDirection ListViewSortDirection 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
      ViewState["sortDirection"] = SortDirection.Ascending; 
     return (SortDirection)ViewState["sortDirection"]; 
    } 
    set { ViewState["sortDirection"] = value; } 
} 

protected void ContactsListView_Sorting(Object sender, ListViewSortEventArgs e) 
{ 
    BindContacts(e.SortExpression + " " + ListViewSortDirection.ToString()); 

    // Check the sort direction to set the image URL accordingly. 
    string imgUrl; 
    if (ListViewSortDirection == SortDirection.Ascending) 
     ListViewSortDirection = SortDirection.Descending; 
    else 
     ListViewSortDirection = SortDirection.Ascending; 
} 

private void BindContacts(string sortExpression) 
{ 
    sortExpression = sortExpression.Replace("Ascending", "ASC"); 
    sortExpression = sortExpression.Replace("Descending", "DESC"); 
    using (SqlConnection conn = new SqlConnection(_connStr)) 
    { 
     conn.Open(); 
     using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM Customer", conn)) 
     { 
      DataTable dTable = new DataTable(); 
      dAd.Fill(dTable); 
      // Sort now 
      dTable.DefaultView.Sort = sortExpression; 
      // Bind data now 
      ContactsListView.DataSource = dTable; 
      ContactsListView.DataBind(); 
     } 
     conn.Close(); 
    } 
} 
0

我想你可以嘗試爲ListViewSorting事件添加處理程序。在那裏給出了事件參數中的排序列和排序順序。這可以很容易地用於構建特定查詢並將其綁定到列表。

+0

他們是不是讓我開始的例子?我知道你正在談論的事件,但我從未使用它。 – PsychoDUCK

+0

試試這個http://www.4guysfromrolla.com/articles/011608-1.aspx –

0

因爲根據排序表達式(你在你的標記定義)的SqlDataSource很可能會做一些像(我不知道這是正是它做什麼)爲您幕後:

Expression<Func<DataRow,object>> myExpression = row => row["SortExpressionYouDefinedForTheColumn"]; 
IEnumerable<DataRow> ex = ds.Tables[0].AsEnumerable().OrderBy(myExpression.Compile()); 

或者SqlDataSource可使用DataViewDataTable排序。

的SqlDataSource可以因爲默認情況下做到這一點,它使用一個DataSet存儲結果集(or so says the documentation):

數據檢索模式如何識別一個SqlDataSource控制從基礎數據庫中檢索數據。

當DataSourceMode屬性設置爲DataSet值時,將數據加載到DataSet對象中並存儲在服務器上的內存中,數據爲 。這 使場景中的用戶界面控件,如GridView控件, 報價排序,篩選和分頁功能..

既然你選擇手動綁定到DataSet中,你需要做的「神奇」自己;換句話說,您可以處理OnSort命令,獲取排序表達式,再次獲取數據源(不管您是從Session還是通過再次調用數據庫執行此操作),並按照與上面所示的行類似的方式進行排序,然後重新綁定到Gridview 。