.net - registros - para que se pueda ordenar un control datagridview debe estar enlazado a un objeto ibindinglist
Permitir al usuario ordenar las columnas de una consulta LINQ en un DataGridView (6)
Mi enfoque predeterminado es copiar todo en una DataTable y vincular DataGridView a eso.
Obviamente, eso no funcionará bien si desea agregar paginación.
No puedo descifrar cómo ordenar un DataGridView poblado en tiempo de ejecución para ordenar (cuando los usuarios hacen clic en los encabezados de las columnas) donde un LINQ de consulta XML es el DataSource, a través de BindingSource.
Dim QueryReOrder = From Q In Query _
Where ((0 - Q.Qualifier) / cmbTSStakeValue.Text) <= 0.1 _
Order By Q.Qualifier Descending _
Select Q
Dim bs As New BindingSource
bs.DataSource = QueryReOrder
DGFindMatch.DataSource = bs
Algunas de las propiedades de DataGridView son:
Sort Nothing String
SortProperty Nothing System.ComponentModel.PropertyDescriptor
SupportsAdvancedSorting False Boolean
SupportsChangeNotification True Boolean
SupportsFiltering False Boolean
SupportsSearching False Boolean
SupportsSorting False Boolean
¿Existe una solución simple que permita a un usuario ordenar estos valores haciendo clic en el encabezado de la columna?
¡Gracias!
Debe obtener los resultados de la consulta como AsEnumerable ().
Dim QueryReOrder = (De Q En Query _ Where ((0 - Q.Qualifier) / cmbTSStakeValue.Text) <= 0.1 _ Ordenar por Q.Qualifier Descending _ Seleccionar Q) .AsEnumerable ()
Debo mencionar que generalmente estoy en C # por lo que es posible que tengas que variar la sintaxis ligeramente.
Debe obtener los resultados de la consulta LINQ en algo que admita la funcionalidad de clasificación. Esto se hace típicamente derivando una clase de BindingList e implementando la funcionalidad de Clasificación de Núcleo en la clase derivada.
Hay muchos ejemplos de implementaciones disponibles para elegir y es bastante sencillo de implementar. Aquí hay un ejemplo de hacerlo en MSDN.
Una vez que haya implementado esto, todo lo que tiene que hacer es poner sus resultados en él y usarlo como su DataSource y la Grilla debería permitir a los usuarios ordenar usando las columnas.
//I know that you asked the question in VB.NET but I don''t know the syntax that well.
public class SortableBindingList<T> : BindingList<T>
{
//override necessary sort core methods
}
SortableBindingList<string> list = new SortableBindingList<string>(QueryReOrder.ToList());
//use list as your DataSource now
Ya, así que luché con esto por un tiempo. Todas las mismas respuestas sobre la creación de una IBindingList genérica personalizada para cada clase. Es una gran cantidad de trabajo por hacer si las columnas en las vistas de la cuadrícula no son estáticas. Deseo poder cambiar mis consultas de linq y no tener que cambiar o actualizar una clase que implemente la IBindingList personalizada. Entonces, esto es lo que hice:
1) Obtenga su consulta IEnumerable .
var query = from o in m_ds.Objective
join ot in m_ds.ObjectiveType on o.ObjectiveTypeId equals ot.Id
join dst in m_ds.DevelopmentStatusType on o.DevelopmentStatusTypeId equals dst.Id
join rt in m_ds.ResultType on o.PrecedenceResultTypeId equals rt.Id
select new
{
o.Id,
type = ot.Description,
precedence = rt.Description,
o.Symbol,
o.Title,
};
2) ¡Convierte ese conjunto de resultados de IEnumerable a DataTable !
public static DataTable DataTableFromIEnumerable( IEnumerable ien )
{
DataTable dt = new DataTable();
foreach ( object obj in ien )
{
Type t = obj.GetType();
PropertyInfo[] pis = t.GetProperties();
if ( dt.Columns.Count == 0 )
{
foreach ( PropertyInfo pi in pis )
{
dt.Columns.Add( pi.Name, pi.PropertyType );
}
}
DataRow dr = dt.NewRow();
foreach ( PropertyInfo pi in pis )
{
object value = pi.GetValue( obj, null );
dr[ pi.Name ] = value;
}
dt.Rows.Add( dr );
}
return dt;
}
3) Enlace su DataGridView a ese objeto genérico DataTable .
var query = SqlHelper.GetFilteredObjective();
var bs = new BindingSource();
bs.DataSource = Utils.DataTableFromIEnumerable( query );
dgvObjectives.DataSource = bs;
4) Eso es todo. Una función de utilidad y estás frito hecho :)
Apoyos a Alberto Poblacion que escribió la función anterior para pasar de un hilo de función IEnumerable a un DataTable:
c # datagridview sortable linq a ADO.NET
use solo la clase MySortableBindingList en esta página Implementing-a-Sortable-BindingList-
entonces
var yourLinqList = ...;
MySortableBindingList sortList = new MySortableBindingList (yourLinqList);
dataGridView1.DataSource = sortList;
entonces su dataGridView debe estar ordenada cuando el encabezado de la celda haga clic.
Otro enlace que da un ejemplo completo de cómo construir una SortableBindingList, como se describe en la respuesta de Brian ONeil , se puede encontrar aquí:
Lista de encuadernación ordenable para objetos de datos personalizados
Pude usar este ejemplo casi textualmente.