【问题标题】:Why do I get a column not found error while sorting a GridView为什么在对 GridView 进行排序时出现未找到列的错误
【发布时间】:2014-08-05 21:03:50
【问题描述】:
<asp:GridView AlternatingRowStyle-BackColor="#E2E2E2" AutoGenerateColumns="false" OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="There is no data to display" OnRowDataBound="yourTasksGV_RowDataBound">
    <Columns>
        <asp:HyperLinkField Target="_blank" DataNavigateUrlFields="Task Detail" DataTextField="Task Name" DataNavigateUrlFormatString="" HeaderText="Task Details" SortExpression="TaskDetails" ItemStyle-Width="35%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Services" HeaderText="Services" SortExpression="ServiceName" ItemStyle-Width="25%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="TheStatus" ItemStyle-Width="15%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Due Date" HeaderText="Due Date" SortExpression="DueDate" ItemStyle-Width="15%" ItemStyle-CssClass="taskTableColumn" />
    </Columns>
</asp:GridView>

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{

    if (!Page.IsPostBack)
    {
        PullData();
    }
}

public void PullData()
{
    DataTable taskData = new DataTable();
    string connString = @"user id = user;" + "password= pss$$$$; server= dev-magician; database= OnBase;" /*+ "Trusted_Connection=yes;"*/  + "connection timeout=30";
    string query = @"SELECT  'http://mg/appnet/workview/objectPop.aspx?objectid=' + CAST(CT.OBJECTID AS VARCHAR) + '&classid=1224' 'Task Detail'
            ,UG.USERGROUPNAME 'Services'
            ,CT.ATTR2812 'Status'
            ,CT.ATTR2752 'Due Date'
            ,CT.ATTR2739 'Task Name'

        FROM HSI.RMOBJECTINSTANCE1224 CT LEFT JOIN HSI.USERGROUP UG on CT.FK2743 = UG.USERGROUPNUM
        WHERE CT.ACTIVESTATUS = 0";

    using (SqlConnection conn = new SqlConnection(connString))
    {
        try
        {
            SqlCommand cmd = new SqlCommand(query, conn);

            // create data adapter
            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            // this will query your database and return the result to your datatable
            da.Fill(taskData);
            //conn.Close();
            yourTasksGV.DataSource = taskData;
            yourTasksGV.DataBind();

            Session["sortData"] = taskData;

        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }
}

protected void yourTasksGV_Sorting(object server, GridViewSortEventArgs e)
{
    /*string strSortExpression = e.SortExpression;
    switch (strSortExpression)
    {
        case "TaskDetails":
            MessageBox.Show("Task Details");
            break;
    }*/
    DataTable dataTable = Session["sortData"] as DataTable;

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

        yourTasksGV.DataSource = dataView;
        yourTasksGV.DataBind();
    }
}
private string ConvertSortDirection(SortDirection sortDirection)
{
    string newSortDirection = String.Empty;

    switch (sortDirection)
    {
        case SortDirection.Ascending:
            newSortDirection = "ASC";
            break;

        case SortDirection.Descending:
            newSortDirection = "DESC";
            break;
    }

    return newSortDirection;
}

我想要实现的是,每当我单击任何标题时,它都应该对 GridView 进行排序,但无论我单击哪个标题文本进行排序,我都会不断收到以下错误:

Exception Details: System.IndexOutOfRangeException: Cannot find column ServiceName.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[IndexOutOfRangeException: Cannot find column ServiceName.]
   System.Data.DataTable.ParseSortString(String sortString) +5313286
   System.Data.DataView.CheckSort(String sort) +35
   System.Data.DataView.set_Sort(String value) +115
   TestOnBase.Pages.Default.yourTasksGV_Sorting(Object server, GridViewSortEventArgs e) +256
   System.Web.UI.WebControls.GridView.OnSorting(GridViewSortEventArgs e) +122
   System.Web.UI.WebControls.GridView.HandleSort(String sortExpression, SortDirection sortDirection) +65
   System.Web.UI.WebControls.GridView.HandleSort(String sortExpression) +78
   System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +497
   System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument) +205
   System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9528578
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724
--------------------------------------------------------------------------------

如何修改代码,以便用户单击哪个标题文本对其进行排序,然后在另一次单击时对其进行排序,依此类推?

数据表:

如何向用户显示:

【问题讨论】:

  • 首先,sortexpression 的值应该等于查询列的名称

标签: c# asp.net sorting gridview


【解决方案1】:

您正在对表达式 ServiceName 进行排序,但您的列名为 Services

<asp:BoundField DataField="Services"
    HeaderText="Services"
    SortExpression="Services"
    ItemStyle-Width="25%"
    ItemStyle-CssClass="taskTableColumn" />

为了更清楚,SortExpression 用于对您绑定到控件的数据源进行排序。因此,就像 SQL ORDER BY 语句一样,您可以指定要对其进行排序的列。

因此,在您的查询中,您将返回五列:任务详细信息、服务、状态、截止日期和任务名称。当您将“服务”列绑定到标签时,这也是必须排序的列,因为基础数据源具有“服务”列。所以即使你的 GridView 的列标题完全不同,你仍然需要按照数据源的列名对其进行排序。

【讨论】:

  • HyperLinkField 怎么样?它没有DataField?
  • 虽然它有一个DataTextField。您的 SortExpression 应该是您将其绑定到的查询中的任何列。
  • 所以将所有内容都更改为相同?我从Task Name 获取文本并将其显示在Task Detail 单元格中......所以链接几乎是Task Detail 值,链接文本显示是Task Name 值。
  • 我更改了 Services 和 Status 以匹配 DataField 和 SortExpression 但是当我点击它们时,页面只是重新加载:/
  • 查看我的编辑以获得进一步的解释。当您在 yourTasksGV_Sorting 处理程序中放置断点时,在您对 DataView 进行排序之后,数据是否正确排序?
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多