首页 > 解决方案 > 使用 C# 对 Gridview 表进行排序

问题描述

目前,我需要对 Gridview 表中的一列进行排序。gridview 表中的数据是从 SharePoint 列表中检索的,而不是从 SQL 数据库中检索的。

我不知道我的代码有什么问题,并且在单击列标题对其进行排序后,该列似乎没有响应。

任何人都可以帮助解决这个问题吗?=(

下面是我对“请求 ID”列进行排序的代码。

<tr>
    <td class="grid-td">
        <asp:GridView ID="gridSubmittedRequests" runat="server" CellPadding="4" ForeColor="#333333" GridLines="Both" AutoGenerateColumns="false" AllowPaging="true" AllowSorting="true" OnPageIndexChanging="gridSubmittedRequests_PageIndexChanging"  OnSorting="gridView_Sorting" PageSize="10" CssClass="grid-format">
            <Columns>
                <asp:BoundField HeaderText="Request ID" DataField="ID" SortExpression="ID" />
                <asp:BoundField HeaderText="Title" DataField="Title" />
                <asp:BoundField HeaderText="Status" DataField="clRequestStatus" />
                <asp:BoundField HeaderText="Reason for Rejection" DataField="clReasonForRejection" />
                <asp:BoundField HeaderText="Comments" DataField="clApproverComments" />
                <asp:BoundField HeaderText="Date Created" DataField="Created" DataFormatString="{0:dd/MM/yyyy}" />
                <asp:HyperLinkField DataNavigateUrlFields="clGeneralFormViewLink" HeaderText="Request Link" Text="View Request" />
            </Columns>
            <AlternatingRowStyle BackColor="White" />
            <EditRowStyle BackColor="#2461BF" />
            <FooterStyle BackColor="#0072c6" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#0072c6" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#EFF3FB" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F5F7FB" />
            <SortedAscendingHeaderStyle BackColor="#6D95E1" />
            <SortedDescendingCellStyle BackColor="#E9EBEF" />
            <SortedDescendingHeaderStyle BackColor="#4870BE" />
        </asp:GridView>
        <asp:Label ID="lblSubmittedRequestNoRecords" runat="server" Visible="false" CssClass="err-msg"></asp:Label>
    </td>
</tr>

using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

using CL.SPEngine;
using CL.Common.Data;
using Microsoft.SharePoint.Workflow;

namespace CL.MDM.WebParts
{
    public partial class RequestorDashboardUserControl : UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack == false)
            {
                this.BindGrid();
            }
        }

        private void BindGrid()
        {
            try
            {
                string currentUserMail = SPContext.Current.Web.CurrentUser.Email;

                #region Draft request query and data binding

                string draftQuery = "<OrderBy><FieldRef Name='Created' Ascending='FALSE'/></OrderBy><Where><And><Eq><FieldRef Name='Author'/><Value Type='Integer'><UserID Type='Integer'/></Value></Eq><Eq><FieldRef Name='" + FieldNames.IsDraft + "'/><Value Type='Boolean'>1</Value></Eq></And></Where>";
                string draftViewFields = "<FieldRef Name='" + FieldNames.Title + "' /><FieldRef Name='" + FieldNames.Created + "' /><FieldRef Name='" + FieldNames.RequestLink + "' /><FieldRef Name='" + FieldNames.ID + "' /><FieldRef Name='" + FieldNames.GeneralFormViewLink + "' />";

                DataTable dtMyDraftRequests = this.GetRequestData(draftQuery, draftViewFields);
                if (dtMyDraftRequests != null)
                {
                    this.BindDraftGrid(dtMyDraftRequests);
                }
                else
                {
                    lblDraftRequestNoRecords.Visible = true;
                    lblDraftRequestNoRecords.Text = "No draft requests found";
                }

                #endregion

                #region Submitted request query and data binding

                string submittedQuery = "<OrderBy><FieldRef Name='Created' Ascending='FALSE'/></OrderBy><Where><And><Eq><FieldRef Name='Author'/><Value Type='Integer'><UserID Type='Integer'/></Value></Eq><Eq><FieldRef Name='" + FieldNames.IsDraft + "'/><Value Type='Boolean'>0</Value></Eq></And></Where>";
                string submittedViewFields = "<FieldRef Name='" + FieldNames.Title + "' /><FieldRef Name='" + FieldNames.RequestStatus + "' /><FieldRef Name='" + FieldNames.Created + "' /><FieldRef Name='" + FieldNames.RequestLink + "' /><FieldRef Name='" + FieldNames.ID + "' /><FieldRef Name='" + FieldNames.GeneralFormViewLink + "' /><FieldRef Name='" + FieldNames.ReasonForRejection + "' /><FieldRef Name='" + FieldNames.ApproverComments + "' />";

                DataTable dtMySubmittedRequests = this.GetRequestData(submittedQuery, submittedViewFields);
                if (dtMySubmittedRequests != null)
                {
                    this.BindSubmittedGrid(dtMySubmittedRequests);
                }
                else
                {
                    lblSubmittedRequestNoRecords.Visible = true;
                    lblSubmittedRequestNoRecords.Text = "No submitted requests found";
                }

                #endregion
            }
            catch (Exception ex)
            {
                MDMLogger.Log(TraceSeverity.Unexpected, EventSeverity.Error, "CL.MDM RequestorDashboard BindGrid : Error " + ex.Message);
            }
        }

        /// <summary>
        /// This function is used to get data from Master data requests list. It will accept query and view fields as parameters
        /// It will convert collection of list items to data table.
        /// </summary>
        /// <param name="query">CAML query in string format to retrieve data from list</param>
        /// <param name="viewFields">View fields to retrieve from the list</param>
        /// <returns>Data table of retrieved items</returns>
        private DataTable GetRequestData(string query, string viewFields)
        {
            DataTable dtMyRequests = null;
            try
            {
                //Getting Master Data Requests list
                SPList mdrList = SPExtension.TryGetListByUrl(SPContext.Current.Web.Lists, Lists.MasterDataRequestForm);
                if (mdrList != null)
                {
                    //Querying list to get required data
                    SPQuery myRequestQuery = new SPQuery();
                    myRequestQuery.Query = query;
                    myRequestQuery.ViewFields = viewFields;

                    //Getting items and converting those items to Data Table
                    SPListItemCollection myRequests = mdrList.GetItems(myRequestQuery);
                    dtMyRequests = new DataTable();
                    dtMyRequests = myRequests.GetDataTable();
                }
            }
            catch (Exception ex)
            {
                MDMLogger.Log(TraceSeverity.Unexpected, EventSeverity.Error, "CL.MDM RequestorDashboard GetRequestData : Error " + ex.Message);
            }

            return dtMyRequests;
        }

        /// <summary>
        /// This function will bind draft request grid
        /// </summary>
        /// <param name="dtSource">Data source for grid</param>
        private void BindDraftGrid(DataTable dtSource)
        {
            try
            {
                DataTable dtFinal = AddEditColumn(dtSource);
                gridDraftRequests.DataSource = dtFinal;
                gridDraftRequests.DataBind();
            }
            catch (Exception ex)
            {
                MDMLogger.Log(TraceSeverity.Unexpected, EventSeverity.Error, "CL.MDM RequestorDashboard BindDraftGrid : Error " + ex.Message);
            }
        }

        /// <summary>
        /// This function will bind submitted request grid
        /// </summary>
        /// <param name="dtSource">Data source for grid</param>
        private void BindSubmittedGrid(DataTable dtSource)
        {
            try
            {
                DataTable dtSubmittedRequests = GetWrokflowStatus(dtSource);
                gridSubmittedRequests.DataSource = dtSubmittedRequests;
                gridSubmittedRequests.DataBind();
            }
            catch (Exception ex)
            {
                MDMLogger.Log(TraceSeverity.Unexpected, EventSeverity.Error, "CL.MDM RequestorDashboard BindSubmittedGrid : Error " + ex.Message);
            }
        }

        private string GetSortDirection(string column)
        {

            // By default, set the sort direction to descending.
            string sortDirection = "DESC";

            // Retrieve the last column that was sorted.
            string sortExpression = ViewState["SortExpression"] as string;

            if (sortExpression != null)
            {
                // Check if the same column is being sorted.
                // Otherwise, the default value can be returned.
                if (sortExpression == column)
                {
                    string lastDirection = ViewState["SortDirection"] as string;
                    if ((lastDirection != null) && (lastDirection == "DESC"))
                    {
                        sortDirection = "ASC";
                    }
                }
            }

            // Save new values in ViewState.
            ViewState["SortDirection"] = sortDirection;
            ViewState["SortExpression"] = column;

            return sortDirection;
        }

        protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
        {
            DataTable dataTable = gridSubmittedRequests.DataSource as DataTable;

            if (dataTable != null)
            {
                DataView dataView = new DataView(dataTable);
                //dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
                dataView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);

                gridSubmittedRequests.DataSource = dataView;
                gridSubmittedRequests.DataBind();
            }

        } 

        protected void gridSubmittedRequests_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gridSubmittedRequests.PageIndex = e.NewPageIndex;
            this.BindGrid();
        }

        protected void gridDraftRequests_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gridDraftRequests.PageIndex = e.NewPageIndex;
            this.BindGrid();
        }

        private DataTable AddEditColumn(DataTable dtSource)
        {
            dtSource.Columns.Add(GeneralConstants.EditLinkColumn);
            for (int counter = 0; counter < dtSource.Rows.Count; counter++)
            {
                string editLink = string.Format(GeneralConstants.GeneralFormEditLinkUrl, SPContext.Current.Web.Url.TrimEnd('/'), Convert.ToString(dtSource.Rows[counter][FieldNames.ID]));
                dtSource.Rows[counter][GeneralConstants.EditLinkColumn] = editLink;
            }
            return dtSource;
        }

        private DataTable GetWrokflowStatus(DataTable dtSource)
        {
            SPList mdmList = SPExtension.TryGetListByUrl(SPContext.Current.Web.Lists, Lists.MasterDataRequestForm);
            if (mdmList != null)
            {
                for (int counter = 0; counter < dtSource.Rows.Count; counter++)
                {
                    string itemID = Convert.ToString(dtSource.Rows[counter][FieldNames.ID]);
                    SPListItem mdmItem = mdmList.GetItemById(Convert.ToInt32(itemID));

                    if (SPContext.Current.Site.WorkflowManager.GetItemWorkflows(mdmItem).Count > 0)
                    {
                        SPWorkflow workflow = SPContext.Current.Site.WorkflowManager.GetItemWorkflows(mdmItem)[0];
                        if (workflow.ParentAssociation.Name.Contains(GeneralConstants.WorkflowName))
                        {
                            if (workflow.InternalState.ToString().Contains(SPWorkflowState.Terminated.ToString()))
                            {
                                dtSource.Rows[counter][FieldNames.RequestStatus] = "Error occured / Workflow Terminated";
                            }
                            else if (workflow.InternalState.ToString().Contains(SPWorkflowState.Faulting.ToString()))
                            {
                                dtSource.Rows[counter][FieldNames.RequestStatus] = "Error occured / Workflow Error";
                            }
                        }
                    }
                }
            }
            return dtSource;
        }
    }
}

标签: javascriptc#asp.netvisual-studio-2013sharepoint-2013

解决方案


推荐阅读