C# ListView排序未设置SortExpression和SortDirection

C# ListView排序未设置SortExpression和SortDirection,c#,asp.net,listview,sorting,C#,Asp.net,Listview,Sorting,我正在开发一个列表视图,在实现排序时,我感觉自己做了一些根本错误的事情。我没有依赖于List1.SortExpression和List1.SortDirection的值,而是求助于隐藏字段,因为List1.SortDirection始终为空,而List1.SortDirection始终为SortDirection.astending 在my.aspx页面上:(编辑掉不相关的代码) ... 更多专栏。。。 在我的代码隐藏中: protected void List1_ItemCommand(o

我正在开发一个
列表视图
,在实现排序时,我感觉自己做了一些根本错误的事情。我没有依赖于
List1.SortExpression
List1.SortDirection
的值,而是求助于隐藏字段,因为
List1.SortDirection
始终为空,而
List1.SortDirection
始终为
SortDirection.astending

在my.aspx页面上:(编辑掉不相关的代码)


... 更多专栏。。。
在我的代码隐藏中:

protected void List1_ItemCommand(object sender, ListViewCommandEventArgs e)
{
    // empty for now
}

protected void List1_Sorting(object sender, ListViewSortEventArgs e)
{
    SortDirection sortDirection;
    String sortExpression = e.SortExpression;   // how we need to do it in Sorting

    if (hdnSortExpression.Value.ToLower() == sortExpression.ToLower())
        sortDirection = hdnSortDirection.Value == SortDirection.Ascending.ToString() ? SortDirection.Descending : SortDirection.Ascending;
    else
        sortDirection = SortDirection.Ascending;

    DoSortList(sortExpression, sortDirection);  // this sets column headings' sort indicator arrows
    List1_BindData(sortExpression, sortDirection);  // sets DataSource and calls DataBind()

    // the hacky part: setting hidden fields to store sortExpression and sortDirection
    hdnEligibilitySortExpression.Value = sortExpression;
    hdnEligibilitySortDirection.Value = sortDirection.ToString();
}

private void List1_BindData(String sortExpression, SortDirection sortDirection)
{
    List<SomeEntity> list = null;

    list = SomeEntity.GetBySsn(_ssn).ToList();  // methods generated by an ORM pointing to an Oracle database

    switch (sortExpression.ToLower())
    {
        case "CompanyCode":
        if (sortDirection == SortDirection.Ascending)
            List1.DataSource = list.OrderBy(o => o.CompanyCode);
        else
            List1.DataSource = list.OrderByDescending(o => o.CompanyCode);
        break;

        ... other cases ...
    }

    List1.DataBind();
}
protectedvoid List1\u ItemCommand(对象发送方,ListViewCommandEventArgs e)
{
//暂时空着
}
受保护的无效列表1_排序(对象发送方、ListViewSortEventArgs e)
{
SortDirection SortDirection;
String-sortExpression=e.sortExpression;//我们需要如何在排序中执行它
if(hdnSortExpression.Value.ToLower()==sortExpression.ToLower())
sortDirection=hdSensortDirection.Value==sortDirection.Ascending.ToString()?sortDirection.Descending:sortDirection.Ascending;
其他的
sortDirection=sortDirection.升序;
DoSortList(sortExpression,sortDirection);//设置列标题的排序指示符箭头
List1_BindData(sortExpression,sortDirection);//设置数据源并调用DataBind()
//hacky部分:设置隐藏字段来存储sortExpression和sortDirection
hdnEligibilitySortExpression.Value=sortExpression;
hdnEligibilitySortDirection.Value=sortDirection.ToString();
}
私有无效列表1_BindData(字符串排序表达式、排序方向或排序方向)
{
List=null;
list=SomeEntity.GetBySsn(_ssn).ToList();//由指向Oracle数据库的ORM生成的方法
开关(sortExpression.ToLower())
{
案例“公司代码”:
if(sortDirection==sortDirection.升序)
List1.DataSource=list.OrderBy(o=>o.CompanyCode);
其他的
List1.DataSource=list.OrderByDescending(o=>o.CompanyCode);
打破
…其他情况。。。
}
List1.DataBind();
}

它可以正常工作——每一列都被正确排序,单击同一列会反转排序方向,但我必须得出结论,我的连接不正确,因为我无法依赖
SortDirection
sortedxpression
属性。我做错了什么?

而不是使用e.SortDirection,你能像List1.SortDirection和List1.SortExpression那样将其从列表视图中拉出吗?

看看这个。 您将注意到数据源是一个SqlDataSource。这是.Net了解如何排序的数据源类型之一。其他人则不然

下面是另一个指定数据源类型的示例:

为排序提供内置支持的数据源控件是LinqDataSource、ObjectDataSource、SqlDataSource和AccessDataSource控件


我很确定这就是它的工作原理。我听说如果您使用数据源控件绑定
列表视图
,那么排序将按预期工作,但如果您手动绑定数据源,则不会。但我不能证实这一点。我想我不会介意SortExpression和SortDirection是否不是只读属性。我会仔细检查(有时显而易见…),但我的问题是List1.SortDirection和List1.SortExpression不会分别从升序和“”更改。哦,明白了,我认为从事件来看,状态是不正确的,也许在控制上是不正确的。我的不是其中之一。我手动排序和绑定我的数据。请看我的编辑,上面。那么,据我所知,你从.Net得到的答案是“太糟糕了”。事实上,你的隐藏字段方法正是团队在我之前的工作中使用的技术。我花了一些时间尝试使用SorExpression和SortDirection,得出的结论是它们不是一个选项。子孙后代:我认为这个答案是正确的,因为它回答了我提出的问题。“我做错了什么?”没什么。
protected void List1_ItemCommand(object sender, ListViewCommandEventArgs e)
{
    // empty for now
}

protected void List1_Sorting(object sender, ListViewSortEventArgs e)
{
    SortDirection sortDirection;
    String sortExpression = e.SortExpression;   // how we need to do it in Sorting

    if (hdnSortExpression.Value.ToLower() == sortExpression.ToLower())
        sortDirection = hdnSortDirection.Value == SortDirection.Ascending.ToString() ? SortDirection.Descending : SortDirection.Ascending;
    else
        sortDirection = SortDirection.Ascending;

    DoSortList(sortExpression, sortDirection);  // this sets column headings' sort indicator arrows
    List1_BindData(sortExpression, sortDirection);  // sets DataSource and calls DataBind()

    // the hacky part: setting hidden fields to store sortExpression and sortDirection
    hdnEligibilitySortExpression.Value = sortExpression;
    hdnEligibilitySortDirection.Value = sortDirection.ToString();
}

private void List1_BindData(String sortExpression, SortDirection sortDirection)
{
    List<SomeEntity> list = null;

    list = SomeEntity.GetBySsn(_ssn).ToList();  // methods generated by an ORM pointing to an Oracle database

    switch (sortExpression.ToLower())
    {
        case "CompanyCode":
        if (sortDirection == SortDirection.Ascending)
            List1.DataSource = list.OrderBy(o => o.CompanyCode);
        else
            List1.DataSource = list.OrderByDescending(o => o.CompanyCode);
        break;

        ... other cases ...
    }

    List1.DataBind();
}