SUPPORT SORTING GRIDVIEW

FBGSYSTEMS 06/05/2015 10:24:30
#446411
Bom dia galera.
Preencho meu datagridview da seguinte forma:

            List<clsNotaItens> lstOrc = new List<clsNotaItens>();

BindingSource b = new BindingSource();

lstOrc = new bdsNotaItens().GetItens(Convert.ToInt64(grid1.CurrentRow.Cells[0].Value));


b.DataSource = lstOrc;

grid2.AutoGenerateColumns = false;
grid2.DataSource = b;


Ja tentei de toda forma deixar as colunas reordenarem os dados e não da!
Achei este link no msdn para resolver o problema.
https://msdn.microsoft.com/pt-br/library/system.windows.forms.datagridview.columnheadermouseclick(v=vs.110).aspx

Fiz o teste e então da um erro:
Não será possível classificar o controle DataGridView se ele estiver ligado a uma IBindingList sem suporte para classificação.


Tentei uma propriedade chamada SupportSorting, mas me parece ser apenas leitura. Como faço para resolver isto ?
NILSONTRES 06/05/2015 10:35:32
#446412
é por isso que não utilizo controles vinculados, pouca diferença em desempenho e vc fica com o Grid preso, se preencher sem datasource, vc manipula como quiser.
FBGSYSTEMS 06/05/2015 10:39:43
#446414
O problema é que o sistema está no final.. com N grid espalhados e não ha como eu refazer todo o sistema :(
Tentei colocar isso no meu List<>

lstPed.Sort();

mas recebi um erro:
Falha ao comparar dois elementos na matriz.
NILSONTRES 06/05/2015 10:51:22
#446415
Nesse seu caso é possível ordenar antes de preencher o list ?
Se não, tenho um código em um sistema que ordena list, preciso achar aqui, mas é trabalhoso.

FBGSYSTEMS 06/05/2015 10:54:45
#446416
Eu pensei nisso, mas ai vou precisar mexer em todas minhas querys para realizar isso.
Algumas que precisavam disso mais urgente acabei no meu metodo colocando um parametro chamado [Ô]orderby[Ô] e o acrescento na minha Query.
Mas em um grid onde tem 10 colunas por exemplo, vai ser horrivel fazer isso. Tem que ter um jeito de deixar o grid reordenar do jeito que eu fiz.
To caçando aqui mas está dificil.
FBGSYSTEMS 06/05/2015 11:48:16
#446420
Finalmente parece que consegui resolver.
Percebi que o DataTable da suporte pra isso. Ai procurei na net um metodo pra converter qualquer List<> para DataTable. E funcionou !!


Tive que colocar este codigo:

Este para deixar todas colunas reordenaveis automaticamente:
        private void grid1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewColumn column in grid1.Columns)
{
column.SortMode = DataGridViewColumnSortMode.Automatic;
}
}


E por ultimo criei uma classe static para o metodo de conversao


Metodo de conversao:
         public static DataTable ConvertToDatatable<T>(List<T> data)
{
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for (int i = 0; i < props.Count; i++)
{
PropertyDescriptor prop = props[i];
if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
table.Columns.Add(prop.Name, prop.PropertyType.GetGenericArguments()[0]);
else
table.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
return table;
}


Chamando assim:

    p.DataSource = converter.ConvertToDatatable(lstPed);
grid1.AutoGenerateColumns = false;
grid1.DataSource = p;


Sabia que teria um jeito, agora vou testar com volume maior de dados pra ver como fica.. Mas um teste com poucas informações (cerca de 200 registros) ficou normal.
Tópico encerrado , respostas não são mais permitidas