C# 对未自动生成列的Gridview进行排序

C# 对未自动生成列的Gridview进行排序,c#,asp.net,sorting,gridview,C#,Asp.net,Sorting,Gridview,我有一个DataTable,它从sql源获取数据并填充gridview。从sql语句排序不是一个选项,因为顺序对于执行一些初始表操作很重要 我希望用户能够单击列,并按该列中的值对gridview进行排序。我在谷歌上搜索了很多这方面的指南,但没有一个真正适合我。这些列永远不可单击。我能够用这段代码实现执行其他操作的可单击行,我想知道这是否会导致任何干扰,如果没有,为什么我不能单击对行进行排序?是不是因为我的列不是自动生成的 //用于可单击的行 if(e.Row.RowType==DataContr

我有一个DataTable,它从sql源获取数据并填充gridview。从sql语句排序不是一个选项,因为顺序对于执行一些初始表操作很重要

我希望用户能够单击列,并按该列中的值对gridview进行排序。我在谷歌上搜索了很多这方面的指南,但没有一个真正适合我。这些列永远不可单击。我能够用这段代码实现执行其他操作的可单击行,我想知道这是否会导致任何干扰,如果没有,为什么我不能单击对行进行排序?是不是因为我的列不是自动生成的

//用于可单击的行

if(e.Row.RowType==DataControlRowType.DataRow){
GridViewRow行=e.行;
DataRow数据=((DataRowView)row.DataItem).row;
e、 添加(“onmouseover”,“this.style.backgroundColor=”#ceedfc');
if(数据字段(“行类型”)!=“总计”)
e、 添加(“onmouseout”,“this.style.backgroundColor=”);
e、 添加(“样式”,“光标:指针;”);
e、 Row.Attributes[“onclick”]=Page.ClientScript.GetPostBackClientHyperlink(suiteReport,“Select$”+e.Row.RowIndex);

我分类的尝试是

 private const string ASCENDING = " ASC";
 private const string DESCENDING = " DESC";
 public SortDirection GridViewSortDirection
 {
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;

        return (SortDirection) ViewState["sortDirection"];                
    }
    set { ViewState["sortDirection"] = value; } 
}


protected void suiteReport_Sorting(object sender, GridViewSortEventArgs e)
{
    string sortExpression = e.SortExpression;

    if (GridViewSortDirection == SortDirection.Ascending)
    {
        GridViewSortDirection = SortDirection.Descending;
        SortGridView(sortExpression, DESCENDING);
    }
    else
    {
        GridViewSortDirection = SortDirection.Ascending;
        SortGridView(sortExpression, ASCENDING); 
    }   

}

private void SortGridView(string sortExpression,string direction)
{

    DataTable dt = (DataTable)Session["QueryTable"];

    DataView dv = new DataView(dt); 
    dv.Sort = sortExpression + direction;         

    suiteReport.DataSource = dv;
    suiteReport.DataBind();         
}
我是基于

但是,正如我所说,这似乎对gridview没有影响。 在aspx文件中,属性“AllowSorting”等于true,而OnSorting调用suiteReport_排序

我不确定问题出在哪里,所以我们非常感谢您的帮助

此外,如果有任何代码,我没有包括,你想看到,请让我知道

多谢各位

编辑:下面是我如何处理回帖的

`如果(!Page.IsPostBack) {

            try
            {
                cn1.Open();

                cmd1 = new SqlCommand("sp_UpdateUsageLog", cn1);
                cmd1.CommandType = CommandType.StoredProcedure;
                cmd1.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar)).Value = userName;
                cmd1.Parameters.Add(new SqlParameter("@userIpAddress", SqlDbType.VarChar)).Value = userIpAddress;
                cmd1.Parameters.Add(new SqlParameter("@userComputerName", SqlDbType.VarChar)).Value = userComputerName;
                cmd1.Parameters.Add(new SqlParameter("@pageViewed", SqlDbType.VarChar)).Value = "Store Report Card";
                cmd1.Parameters.Add(new SqlParameter("@visitDate", SqlDbType.DateTime)).Value = DateTime.Now;

                cmd1.ExecuteNonQuery();
            }
            catch { }
            finally
            {
                cn1.Close();
            }
EDIT2:以下是gridview的aspx:

<asp:GridView ID="suiteReport" AutoGenerateColumns="false" ShowFooter="true" runat="server" OnRowDataBound="suiteReport_RowDataBound" OnSelectedIndexChanged="suiteReport_SelectedIndexChanged" AllowSorting="true" OnSorting="suiteReport_Sorting">


我相信我已经找到了答案,或者至少取得了足够的进展。我的标题行不可单击的原因是我忽略了向绑定字段添加SortExpressions。因为我是动态构建列,所以我通过在gridview中循环标题,创建一个新的boundfield来实现这一点(这是我以前做过的)并为BoundField提供一个SortExpression(myBoundField.SortExpression=“headerName”)


希望这能帮助那些被卡住的人。

你是否正确捕获回发事件,不让页面重新写入?@Dean.DePue我确实有一个关于page.IsPostBack的陷阱,但是“不让页面重新写入”是什么意思?当它是回发时,你会做什么?网格中是否显示完全相同的排序?@Dean.DePue我相信会,是的。单击各种按钮只会更改显示的行,但数据表保持不变且顺序相同。当它是回发时,代码是什么样子的?