【问题标题】:Sorting a GridView with an ObjectDataSource is not Sorting使用 ObjectDataSource 对 GridView 进行排序不是排序
【发布时间】:2008-11-04 21:21:35
【问题描述】:

我有一个如下的网格视图:

 <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 已启用。这是我使用的获取数据并将对象数据源绑定到网格的方法:

        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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    当您使用 ObjectDataSource(或任何其他 *DataSource)时,您为 GridView 设置 DataSourceID,而不是 DataSource。 DataSourceID 应该是您的 ObjectDataSource 的 ID。如果您提供 ObjectDataSource 的声明,我可能会提供更多帮助。

    至于为什么您的数据源在排序事件中为空,这是因为您设置了数据源,将页面发送到客户端,单击列标题,发送回服务器,现在有一个全新的 GridView 实例从未设置过它的 DataSource 属性。旧的 GridView 实例(以及您绑定到的数据表)已被丢弃。

    【讨论】:

    • 谢谢,我会尝试设置 ID 并通知您。
    【解决方案2】:

    当您回发时,您的数据源不再存在。

    尝试在您的 Page_Init 函数中创建您的数据源,然后将您的 gridview 连接到它。一直为我工作(使用 SQLDataSources)。

    编辑:或者,您可以在每次回发时为网格重新创建数据源。这可能行得通。

    EDIT2:或者,您可以将 DataSource 保存到 ViewState(如果它不是那么大),然后在回发时将网格重置为视图状态中的任何数据源(再次强调,数据集不会非常大,否则你会有很慢的加载时间)

    【讨论】:

    • 感谢您的意见。我会考虑到这一点。
    【解决方案3】:

    与其他 2 个答案一起,要记住的另一件事是,在使用 ObjectDataSource 时,您需要在方法上设置一个参数来进行排序。 ObjectDataSources 只是将排序表达式作为字符串传递给您的对象,然后由您的对象自行处理排序。在 ObjectDataSource 中,将 SortParameterName 设置为排序参数名称的值。请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.sortparametername.aspx 了解更多信息。

    【讨论】:

      【解决方案4】:
      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
      

      【讨论】:

        猜你喜欢
        • 2015-06-11
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 2010-11-03
        • 1970-01-01
        • 2017-12-14
        相关资源
        最近更新 更多