簡體   English   中英

使用ObjectDataSource對GridView進行排序不是排序

[英]Sorting a GridView with an ObjectDataSource is not Sorting

我有如下的網格視圖:

 <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時,它是null。 我很好奇為什么? 這是代碼嗎?

  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

當您使用ObjectDataSource(或任何其他* DataSource)時,您為GridView設置DataSourceID,而不是DataSource。 DataSourceID應該是ObjectDataSource的ID。 如果您提供ObjectDataSource的聲明,我可能會提供更多幫助。

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

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

嘗試在Page_Init函數中創建數據源,然后將gridview掛鈎到它。 一直為我工作(使用SQLDataSources)。

編輯:或者,您可以在每個回發上為網格重新創建數據源。 那可能有用。

編輯2:或者,您可以將您的DataSource保存到ViewState(如果它不是那么大),然后將網格重置為回發視圖狀態中的任何數據源(同樣,我強調數據集不是很大,否則你會加載時間很慢)

除了其他2個答案之外,另外要記住的是,在使用ObjectDataSource時,您需要在方法上有一個參數來進行排序。 ObjectDataSources只是將一個排序表達式作為字符串傳遞給您的對象,並將其直接傳遞給您的對象以自行處理排序。 在ObjectDataSource中,將SortParameterName設置為sort參數名稱的值。 有關詳細信息,請參閱http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.sortparametername.aspx

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM