Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在gridview中对数据进行排序?_C#_Asp.net_Gridview_Gridview Sorting - Fatal编程技术网

C# 如何在gridview中对数据进行排序?

C# 如何在gridview中对数据进行排序?,c#,asp.net,gridview,gridview-sorting,C#,Asp.net,Gridview,Gridview Sorting,我正在尝试在gridview中对数据进行排序 Marks----> When I click this for sorting it's taking Marks 1 1 8 1st number only sorted --->

我正在尝试在gridview中对数据进行排序

   Marks----> When I click this for sorting it's taking     Marks     

    1                                                         1                            
    8                         1st number only sorted  --->    12
    40                                                        21 
    12                                                        40
    21                                                        8 
一切正常,但数字列(标记)只对第一个数字进行排序

代码:

 protected void gvTrHty_Sorting(object sender, GridViewSortEventArgs e)
    {
        try
        {
            this.gviewSorting(e.SortExpression);
        }
        catch (Exception ex)
        {
            string arg_15_0 = ex.Message;
        }
    }

 private void gviewSorting(string strSortExp)
    {
        if (this.ViewState["dvTrain"] == null)
        {
            DataSet dataSet = this.BindTraining();
            dv = dataSet.Tables[0].DefaultView;
        }
        else
        {
            DataSet dataSet2 = (DataSet)this.ViewState["dvTrain"];
            TrainingHistory.dv = dataSet2.Tables[0].DefaultView;
        }
        if (TrainingHistory.sortorder)
        {
            TrainingHistory.sortorder = false;
            TrainingHistory.dv.Sort = strSortExp + " DESC";
        }
        else
        {
            TrainingHistory.sortorder = true;
            TrainingHistory.dv.Sort = strSortExp;
        }
        this.BindData(TrainingHistory.dv);
    }
如果我在gridview的标记(列)中有值

   Marks----> When I click this for sorting it's taking     Marks     

    1                                                         1                            
    8                         1st number only sorted  --->    12
    40                                                        21 
    12                                                        40
    21                                                        8 
它将“数字”数据视为字符串,并根据该字符串值进行排序,因此“40”小于“8”

你的选择是:

  • 将前导零放在数字字段值上,由于明显的原因,这可能是不允许的,这将允许现有排序正常工作。我想您可以暂时放置前导零,然后在排序后将其删除,但这听起来像是一个头痛的问题
  • 实现您自己的排序逻辑,如下所示:

    public sealed class GenericComparer<T> : IComparer<T>
    {
        public enum SortOrder
        {
            Ascending = 0,
            Descending = 1
        }
    
        private string sortColumn;
        private SortOrder sortingOrder;
    
        public string SortColumn
        {
            get
            {
                return this.sortColumn;
            }
        }
    
        public SortOrder SortingOrder
        {
            get
            {
                return this.sortingOrder;
            }
        }
    
        public GenericComparer(string theSortColumn, SortOrder theSortingOrder)
        {
            this.sortColumn = theSortColumn;
            this.sortingOrder = theSortingOrder;
        }
    
        public int Compare(T x, T y)
        {
            PropertyInfo thePropertyInfo = typeof(T).GetProperty(this.sortColumn);
            IComparable object1 = (IComparable)thePropertyInfo.GetValue(x, null);
            IComparable object2 = (IComparable)thePropertyInfo.GetValue(y, null);
    
            if (this.sortingOrder == SortOrder.Ascending)
            {
                return object1.CompareTo(object2);
            }
            else
            {
                return object2.CompareTo(object1);
            }
        }
    }
    
    公共密封类GenericComparer:IComparer
    {
    公共枚举排序器
    {
    升序=0,
    递减=1
    }
    私有字符串排序列;
    私人分拣员分拣订单;
    公共字符串排序列
    {
    收到
    {
    返回此.sort列;
    }
    }
    公共分拣机分拣订单
    {
    收到
    {
    返回此.sortingOrder;
    }
    }
    公共泛型比较器(字符串排序列,排序顺序排序器排序顺序)
    {
    this.sort列=排序列;
    this.sortingOrder=排序顺序;
    }
    公共整数比较(TX,TY)
    {
    PropertyInfo thePropertyInfo=typeof(T).GetProperty(this.sortColumn);
    IComparable object1=(IComparable)thePropertyInfo.GetValue(x,null);
    IComparable object2=(IComparable)thePropertyInfo.GetValue(y,null);
    if(this.sortingOrder==SortOrder.Ascending)
    {
    返回object1.CompareTo(object2);
    }
    其他的
    {
    返回object2.CompareTo(object1);
    }
    }
    }
    
  • 现在,在对
    .Sort()
    方法的调用中,您传递了这个helper类的一个新实例(传递给它您想要排序的列和您想要排序的方向-升序或降序)


    由于上面的比较器逻辑使用泛型,因此您可以传递任何要排序的类型(即
    int
    DateTime
    ,甚至是整个域对象)。

    它执行字母排序,而不是数字排序。标记列是否在某处转换为文本?是否使用绑定列表作为数据源?如果没有,你能做到吗?