2008-11-04 30 views
2

我有一個GridView象下面這樣:排序與一個ObjectDataSource一個GridView不排序

<asp:GridView DataKeyNames="TransactionID" 
       AllowSorting="True" AllowPaging="True"ID="grvBrokerage" 
       runat="server" AutoGenerateColumns="False" 
       CssClass="datatable" Width="100%" 
       <Columns> 
        <asp:BoundField DataField="BrkgAccountNameOutput"    
            HeaderText="Account Name"/> 
        <asp:BoundField DataField="TransactionAmount" 
            HeaderText="Transaction Amount" 
            SortExpression="TransactionAmount" /> 
        <asp:BoundField DataField="TransType" 
            HeaderText="Transaction Type"   
            SortExpression="TransType"/> 
        <asp:BoundField DataField="AccountBalance" 
            HeaderText="Account Balance"/> 
        <asp:BoundField DataField="CreateDt" 
            HeaderText="Transaction Date" /> 
       </Columns> 
</asp:GridView> 

我有一個GridView和ObjectDataSource控件的頁面。 AllowPaging和AllowSorting已啓用。下面是我使用的獲取數據並結合該ObjectDataSource電網的方法:我有一個排序事件

 protected void BindBrokerageDetails() 
     { 
      HomePage master = (HomePage)Page.Master; 

      BrokerageAccount brokerageAccount = new BrokerageAccount(); 
      brokerageAccount.UserID = new Guid(Membership.GetUser().ProviderUserKey.ToString()); 

      ddlBrokerageDetails.DataSource = brokerageAccount.GetAll(); 
      ddlBrokerageDetails.DataTextField = "Account Name"; 
      ddlBrokerageDetails.DataValueField = "Account Name"; 
      ddlBrokerageDetails.DataBind(); 
      if (ddlBrokerageDetails.Items.Count > 0) 
      { 
       BrokerageTransactions brokerageaccountdetails = new   
              BrokerageTransactions(); 
       DataSet ds = BrokerageAccount.GetBrkID2(
            new Guid(Membership 
               .GetUser() 
               .ProviderUserKey 
               .ToString()), 
            ddlBrokerageDetails 
               .SelectedItem 
               .Text 
               .ToString()); 
       foreach (DataRow dr in ds.Tables[0].Rows) 
       { 
        brokerageaccountdetails.BrokerageId = new Guid(dr["BrkrgId"].ToString()); 
       } 

       ddlBrokerageDetails.SelectedItem.Value = brokerageaccountdetails.BrokerageId.ToString(); 
       grvBrokerage.DataSource = ObjectDataSource1; 
       grvBrokerage.DataBind(); 
      }   
     } 

,但是當我檢查grvBrokerage.DataSource,它是空的。我很好奇,爲什麼?這是這個代碼嗎?

protected void grvBrokerage_Sorting(object sender, GridViewSortEventArgs e) 
     {     
     DataTable dt = grvBrokerage.DataSource as DataTable; 

      if (dt != null) 
      {      
       DataView dv = new DataView(dt); 
       dv.Sort = e.SortExpression + " " + e.SortDirection;  
       grvBrokerage.DataSource = dv; 
       grvBrokerage.DataBind(); 
      } 
     } 

這裏是ObjectDataSource控件聲明:

<asp:ObjectDataSource ID="ObjectDataSource1" 
         runat="server" 
         SelectMethod="GetAllWithId" 
         TypeName="BrokerageTransactions"> 
         <SelectParameters> 
          <asp:ControlParameter 
           ControlID="ddlBrokerageDetails"   
           Name="brokid" 
           PropertyName="SelectedValue" 
           Type="Object" /> 
         </SelectParameters> 
</asp:ObjectDataSource> 

感謝, X

回答

6

如果您使用的是ObjectDataSource控件(或任何其他*數據源),可以設置你的GridView的DataSourceID的,不是數據源。 DataSourceID應該是你的ObjectDataSource的ID。如果您提供了ObjectDataSource的聲明,我可能會提供更多幫助。

至於爲什麼你的DataSource在你的Sorting事件中爲null,這是因爲你設置了DataSource,發送了頁面到客戶端,點擊了列標題,回到服務器,現在有一個全新的GridView實例從未有過其DataSource屬性集。舊的GridView實例(和綁定​​的數據表)已被拋棄。

+0

謝謝,我會嘗試設置ID並讓你知道。 – Xaisoft 2008-11-05 02:02:32

2

當您回傳時,您的數據源不再存在。

嘗試在你的Page_Init函數中創建你的數據源,然後把你的gridview掛上去。一直爲我工作(使用SQLDataSources)。

編輯:或者,您可以重新創建您的每個回髮網格的數據源。這可能會起作用。 (或者,你可以將你的數據源保存到ViewState(如果它不是那麼大),然後重置網格爲任何數據源在視圖狀態回發(再次,我強調數據集不是巨大或否則你將有緩慢的加載時間)

+0

感謝您的輸入。我會考慮到這一點。 – Xaisoft 2008-11-05 02:03:32

2

隨着其他2個答案,另一個要記住的是,當使用ObjectDataSource,你需要有一個參數在你的方法,將做排序。 ObjectDataSources只是將一個排序表達式作爲一個字符串傳遞給你的對象,直到你的對象自己處理排序。在ObjectDataSource中,您將SortParameterName設置爲排序參數名稱的值。有關更多信息,請參見http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.sortparametername.aspx

0
Protected Sub gvRevstatus_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvRevstatus.Sorting 
    Dim instance As GridView = gvRevstatus Dim cmd As String 

    cmd = "SELECT Status,CONVERT(VARCHAR(10),StatusDate,101) AS StatusDate,RevNo,CommentBY FROM tabStatus WHERE ID =" & CInt(lblId.Text.Trim) & _ 
    " Order by StatusDate" 
    dim gvtab as datatable = BOClaim.GVBoundTab(cnstr, cmd, gvstatus) ' my own classto databind 
    Dim dv As New DataView(gvtab) 
    dv.Sort = e.SortExpression 

    gvRevstatus.DataSource = dv 
    gvRevstatus.DataBind() 
End Sub 
相關問題