SUPPORT SORTING GRIDVIEW
Bom dia galera.
Preencho meu datagridview da seguinte forma:
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 ?
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 ?
é 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.
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.
Tentei colocar isso no meu List<>
lstPed.Sort();
mas recebi um erro:
Falha ao comparar dois elementos na matriz.
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.
Se não, tenho um código em um sistema que ordena list, preciso achar aqui, mas é trabalhoso.
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.
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.
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:
E por ultimo criei uma classe static para o metodo de conversao
Metodo de conversao:
Chamando assim:
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.
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