WEB开发网
开发学院WEB开发ASP 解决DataGridView绑定List后不能排序的问题 阅读

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

 2010-02-05 10:46:13 来源:WEB开发网   
核心提示: 以前不都是用table直接绑定DataGridView的,没有出现过不能排序的问题,解决DataGridView绑定List后不能排序的问题,初试List结果发现不管怎么样都不能实现排序的功能,有朋友说DataGridView每一列都有个Sortable,这样的确定是可以实现 我想要的效果的,不知道这样做有什么不到之
   以前不都是用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中的。

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

Tags:解决 DataGridView 绑定

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接