Benutzerdefinitiertes Sortieren beim DataGrid in C#
Frank Dzaebel, erstellt am: 1.08.2005, zuletzt geändert: 1.08.2005
Kategorie:DataGrid, .NET-Version:1.1, [Download]

Beispiel-IP-Sortierung einer DataGrid-Spalte durch Klick auf den ColumnHeader.
Da es wenig Beispiele gibt, wie man die ApplySort-Methode der IBindingList benutzten kann,
hier ein Beispiel.



(Momentan fehlt noch die ListChanged-Notification bei ApplySort)

  //... Anfang weggelassen. IpDataView dv = new IpDataView();
  DataTable dt = new DataTable("IP-Adressen");
  const int SortColumn = 0;
  private void Form1_Load(object sender, System.EventArgs e)
  {
    dt.Columns.Add(new DataColumn("IP-Adresse", typeof(string)));
    string[] IPs = {"127.0.0.1", "127.0.0.10", "128.0.0.1", "127.0.0.2"};
    foreach (string ip in IPs)
    {
      DataRow dr= dt.NewRow(); dr[SortColumn]= ip; 
      dt.Rows.Add(dr);
    }
    dv.Table = dt;
    dataGrid1.DataSource = dv;
  }
}

public class IpDataView : DataView, IBindingList
{
  #region IBindingList Member

  void IBindingList.ApplySort(PropertyDescriptor property, System.ComponentModel.ListSortDirection direction)
  {
    SortTable(Table,property.DisplayName,listSortDirection);
  }

  private ListSortDirection listSortDirection = ListSortDirection.Descending;
  public System.ComponentModel.ListSortDirection SortDirection
  {
    get
    {
      if (listSortDirection == ListSortDirection.Ascending)
        listSortDirection = ListSortDirection.Descending;
      else
        listSortDirection = ListSortDirection.Ascending;
      return listSortDirection;
    }
  }

  public bool SupportsChangeNotification {get{return true;}}
  #endregion

  private bool IpInCorrectDirection(DataTable dt, int row, 
    string sortColumnName, ListSortDirection direction)
  {
    if (direction == ListSortDirection.Ascending)
      return IpCompareTo(dt.Rows[row][sortColumnName], 
        dt.Rows[row+1][sortColumnName]) > 0;
    else
      return IpCompareTo(dt.Rows[row][sortColumnName], 
        dt.Rows[row+1][sortColumnName]) < 0;
  }   

  public int IpCompareTo(object ip1, object ip2)
  { //using System.Net;
    string[] sip1 = ((string)ip1).Split('.');
    string[] sip2 = ((string)ip2).Split('.');
    Array.Reverse(sip1); Array.Reverse(sip2);
    IPAddress lhsIP = IPAddress.Parse(String.Join(".", sip1));
    IPAddress rhsIP = IPAddress.Parse(String.Join(".", sip2));
    return lhsIP.Address.CompareTo(rhsIP.Address);
  }

  private void SortTable(DataTable dt, string sortColumnName, ListSortDirection direction)
  {
    int limit= dt.Rows.Count-1; //BubleSort
    for(int pass=0; pass<limit; pass++) 
      for(int j=0;j<limit-pass;j++) 
        if(IpInCorrectDirection(dt, j, sortColumnName, direction))
        {
          object[] dr = dt.Rows[j].ItemArray; 
          dt.Rows[j].ItemArray = dt.Rows[j+1].ItemArray;
          dt.Rows[j+1].ItemArray = dr;
        } 
  }