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;
}
}