tamaño sólo que puede pueda permitir para ordenar objeto ibindinglist formato filas estar enlazado enlazadas ejemplos diseño debe datos dar control columnas cambiar c# winforms datagridview

c# - sólo - para que se pueda ordenar un control datagridview debe estar enlazado a un objeto ibindinglist



¿Cómo ordenar la columna DataGridView enlazada a datos? (2)

Sé que hay muchas preguntas sobre este tema. He pasado por todos ellos, pero nada parece ayudar.

¿Cómo ordenar haciendo clic en el encabezado de la columna?

¿Cómo debo modificar este código para hacer el trabajo?

public partial class Form1 : Form { public Form1() { List<MyClass> list = new List<MyClass>(); list.Add(new MyClass("Peter", 1202)); list.Add(new MyClass("James", 292)); list.Add(new MyClass("Bond", 23)); BindingSource bs = new BindingSource(); bs.DataSource = list; DataGridView dg = new DataGridView(); DataGridViewTextBoxColumn c = new DataGridViewTextBoxColumn(); c.Name = "name"; c.DataPropertyName = "Name"; dg.Columns.Add(c); c = new DataGridViewTextBoxColumn(); c.Name = "number"; c.DataPropertyName = "Number"; dg.Columns.Add(c); dg.DataSource = bs; this.Controls.Add((Control)dg); } } class MyClass:IComparable<MyClass> { public string Name { get; set; } public int Number { get; set; } public MyClass(){} public MyClass(string name,int number) { Name = name; Number = number; } public override string ToString() { return string.Format("{0}:{1}",Name,Number); } #region IComparable<MyClass> Members public int CompareTo(MyClass other) { return Name.CompareTo(other.Name); } #endregion }



Recuerdo haber tenido problemas para encontrar algo que funcionaría cuando añadí la ordenación a mis redes de datos también. Puede implementar una lista enlazable ordenable agregando primero la siguiente clase a su proyecto. Es una implementación de lista que implementa BindingList<T> , de modo que puede enlazar su cuadrícula de datos con ella, y también admite la ordenación. Una mejor explicación de los detalles de lo que podría dar es en MSDN aquí

public class SortableBindingList<T> : BindingList<T> { private ArrayList sortedList; private ArrayList unsortedItems; private bool isSortedValue; public SortableBindingList() { } public SortableBindingList(IList<T> list) { foreach (object o in list) { this.Add((T)o); } } protected override bool SupportsSearchingCore { get { return true; } } protected override int FindCore(PropertyDescriptor prop, object key) { PropertyInfo propInfo = typeof(T).GetProperty(prop.Name); T item; if (key != null) { for (int i = 0; i < Count; ++i) { item = (T)Items[i]; if (propInfo.GetValue(item, null).Equals(key)) return i; } } return -1; } public int Find(string property, object key) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); PropertyDescriptor prop = properties.Find(property, true); if (prop == null) return -1; else return FindCore(prop, key); } protected override bool SupportsSortingCore { get { return true; } } protected override bool IsSortedCore { get { return isSortedValue; } } ListSortDirection sortDirectionValue; PropertyDescriptor sortPropertyValue; protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { sortedList = new ArrayList(); Type interfaceType = prop.PropertyType.GetInterface("IComparable"); if (interfaceType == null && prop.PropertyType.IsValueType) { Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType); if (underlyingType != null) { interfaceType = underlyingType.GetInterface("IComparable"); } } if (interfaceType != null) { sortPropertyValue = prop; sortDirectionValue = direction; IEnumerable<T> query = base.Items; if (direction == ListSortDirection.Ascending) { query = query.OrderBy(i => prop.GetValue(i)); } else { query = query.OrderByDescending(i => prop.GetValue(i)); } int newIndex = 0; foreach (object item in query) { this.Items[newIndex] = (T)item; newIndex++; } isSortedValue = true; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } else { throw new NotSupportedException("Cannot sort by " + prop.Name + ". This" + prop.PropertyType.ToString() + " does not implement IComparable"); } } protected override void RemoveSortCore() { int position; object temp; if (unsortedItems != null) { for (int i = 0; i < unsortedItems.Count; ) { position = this.Find("LastName", unsortedItems[i].GetType(). GetProperty("LastName").GetValue(unsortedItems[i], null)); if (position > 0 && position != i) { temp = this[i]; this[i] = this[position]; this[position] = (T)temp; i++; } else if (position == i) i++; else unsortedItems.RemoveAt(i); } isSortedValue = false; OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } } public void RemoveSort() { RemoveSortCore(); } protected override PropertyDescriptor SortPropertyCore { get { return sortPropertyValue; } } protected override ListSortDirection SortDirectionCore { get { return sortDirectionValue; } } }

Con eso en su lugar, los únicos cambios que debe realizar en el código que ha publicado anteriormente es crear un SortableBindingList basado en su lista y vincularlo a la lista ordenable, en lugar de la lista estándar, como sigue:

List<MyClass> list = new List<MyClass>(); list.Add(new MyClass("Peter", 1202)); list.Add(new MyClass("James", 292)); list.Add(new MyClass("Bond", 23)); // Added sortable list... SortableBindingList<MyClass> sortableList = new SortableBindingList<MyClass>(list); BindingSource bs = new BindingSource(); bs.DataSource = sortableList; // Bind to the sortable list

Y eso será suficiente para que empieces.