解决DataGridView绑定List后不能排序的问题

以前不都是用table直接绑定DataGridView的,没有出现过不能排序的问题,初试List结果发现不管怎么样都不能实现排序的功能,有朋友说

DataGridView每一列都有个Sortable,默认Automatic,改成NotSortable了,结果怎样,还是不行啦。

     还有朋友说, 你可以拖一个bindingsource控件. bindingsource.datasource=泛型集合 datagridview.datasource=bindingsource;

我发现也是不行,那要怎么办呢?查一下资料才知道

    用泛型会失去DateTable的特性,要实现System.Collections.Generic.IComparer<T> 才能实现排序

 没有办法只能实现 一把了

  看一下下面的代码吧, 基本 是这样的

代码
using  System;
using  System.ComponentModel;
using  System.Collections.Generic;
using  System.Reflection;

namespace  BaseFunction
{
    
class  ObjectPropertyCompare < T >  : System.Collections.Generic.IComparer < T >  
    {
        
private  PropertyDescriptor property;
        
private  ListSortDirection direction;

        
public  ObjectPropertyCompare(PropertyDescriptor property, ListSortDirection direction)
        {
            
this .property  =  property;
            
this .direction  =  direction;
        }

        
#region  IComparer<T>

        
///   <summary>
        
///  比较方法
        
///   </summary>
        
///   <param name="x"> 相对属性x </param>
        
///   <param name="y"> 相对属性y </param>
        
///   <returns></returns>
         public   int  Compare(T x, T y)
        {
            
object  xValue  =  x.GetType().GetProperty(property.Name).GetValue(x,  null );
            
object  yValue  =  y.GetType().GetProperty(property.Name).GetValue(y,  null );

            
int  returnValue;

            
if  (xValue  is  IComparable)
            {
                returnValue 
=  ((IComparable)xValue).CompareTo(yValue);
            }
            
else   if  (xValue.Equals(yValue))
            {
                returnValue 
=   0 ;
            }
            
else
            {
                returnValue 
=  xValue.ToString().CompareTo(yValue.ToString());
            }

            
if  (direction  ==  ListSortDirection.Ascending)
            {
                
return  returnValue;
            }
            
else
            {
                
return  returnValue  *   - 1 ;
            }
        }

        
public   bool  Equals(T xWord, T yWord)
        {
            
return  xWord.Equals(yWord);
        }

        
public   int  GetHashCode(T obj)
        {
            
return  obj.GetHashCode();
        }

        
#endregion
    }
}

 

在实现了这个接口之后还不能急,我们还要来写一个SortableBindingList <T> :BindingList <T> 的类用来绑定数据

基本实现

 

代码
using  System;
using  System.ComponentModel;
using  System.Collections.Generic;
using  System.IO;
using  System.Runtime.Serialization.Formatters.Binary;
using  System.Text;

namespace  BaseFunction
{
    
public   class  BindingCollection < T >  : BindingList < T >
    {
        
private   bool  isSorted;
        
private  PropertyDescriptor sortProperty;
        
private  ListSortDirection sortDirection;

        
protected   override   bool  IsSortedCore
        {
            
get  {  return  isSorted; }
        }

        
protected   override   bool  SupportsSortingCore
        {
            
get  {  return   true ; }
        }

        
protected   override  ListSortDirection SortDirectionCore
        {
            
get  {  return  sortDirection; }
        }

        
protected   override  PropertyDescriptor SortPropertyCore
        {
            
get  {  return  sortProperty; }
        }

        
protected   override   bool  SupportsSearchingCore
        {
            
get  {  return   true ; }
        }

        
protected   override   void  ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
        {
            List
< T >  items  =   this .Items  as  List < T > ;

            
if  (items  !=   null )
            {
                ObjectPropertyCompare
< T >  pc  =   new  ObjectPropertyCompare < T > (property, direction);
                items.Sort(pc);
                isSorted 
=   true ;
            }
            
else
            {
                isSorted 
=   false ;
            }

            sortProperty 
=  property;
            sortDirection 
=  direction;

            
this .OnListChanged( new  ListChangedEventArgs(ListChangedType.Reset,  - 1 ));
        }

        
protected   override   void  RemoveSortCore()
        {
            isSorted 
=   false ;
            
this .OnListChanged( new  ListChangedEventArgs(ListChangedType.Reset,  - 1 ));
        }
        //排序
        
public   void  Sort(PropertyDescriptor property, ListSortDirection direction)
        {
            
this .ApplySortCore(property, direction);
        }
    }
}

 

现 在应该流到怎么使用了,其实很简单

直接

 BindingCollection < object   >  objList  =   new  BindingCollection < object > ();
 objList 
= 你的结果集;
 
this .dataGridView1.DataSource  =  objList;

 

但是现在是问题是我的之前用的是List,不想改,而且调用的是Dll,人家返回的就是一个List,我没有办法改成BindingCollection<object >啊。

想了半天还是想出来了,只是不知道 在性能和别的方面怎么样,所以把代码发上来大家讨论一下

我是这样实现 的

代码
  // 可以实现排序的类
            BindingCollection < historyorderInfo >  objList  =   new  BindingCollection < historyorderInfo > ();
            
// 加载数据
             foreach  (historyorderInfo item  in  tmpList)
            {
                objList.Add(item);
            }
            dgvhistory.DataSource 
=  objList;

 

 

这里的tmpList就是我之前使用的系统原本的List,我是使用了 foreach 把原来的数据导入到BindingCollection中的。

这样的确定是可以实现 我想要的效果的。不知道这样做有什么不到之处。希望能得到高人的指点啊,呵呵

                         

                              如有转载请注明出处谢谢合作!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值