Foros del Web » Programación para mayores de 30 ;) » .NET »

Linq Vs Datagridview.Datasource

Estas en el tema de Linq Vs Datagridview.Datasource en el foro de .NET en Foros del Web. Buenas, estoy apunto de probocar un suicidio colectivo por culpa de esto. Cuando asigno una consulta LINQ a un Datagridview, me genera todo bien, pero ...
  #1 (permalink)  
Antiguo 02/09/2009, 05:58
Avatar de sirurza  
Fecha de Ingreso: julio-2009
Mensajes: 14
Antigüedad: 15 años, 4 meses
Puntos: 0
Linq Vs Datagridview.Datasource

Buenas, estoy apunto de probocar un suicidio colectivo por culpa de esto.
Cuando asigno una consulta LINQ a un Datagridview, me genera todo bien, pero no permite ordenar haciendo un simple click a la cabecera de la columna.

En MSDN no aclaran nada, dicen que tengo que usar unos interfaces pero no dice ni como ni donde....
Aqui teneis el codigo, para que veis mas o menos lo simple que es....

Código vb:
Ver original
  1. Public Sub New(ByVal _Entorno As object ByVal empresa As Empresa)
  2.         InitializeComponent()
  3.  
  4.         Me._Empresa = empresa
  5.         Me._Entorno = _Entorno
  6.  
  7.      
  8.         Using db As New nasav4(_Entorno.StringConection)
  9.             Dim pr_empres = From din_empres In db.din_empres _
  10.                             Order By din_empres.cod_emp
  11.             dgEmpresas.DataSource = pr_empres
  12.  
  13.  
  14.             dgEmpresas.SelectionMode = Windows.Forms.DataGridViewSelectionMode.FullRowSelect
  15.             Me.Dock = Windows.Forms.DockStyle.Fill
  16.  
  17.          
  18.         End Using
  19.  
  20.     End Sub

Si fuerzo el Ordenado(Sort) me salta esta excepción.
Código vb:
Ver original
  1. No se controló System.InvalidOperationException
  2.   Message="No se puede ordenar un control DataGridView si está enlazado a un IBindingList que no admite la acción de ordenar."
  3.   Source="System.Windows.Forms"
  4.   StackTrace:
  5.        en System.Windows.Forms.DataGridView.SortDataBoundDataGridView_PerformCheck(DataGridViewColumn dataGridViewColumn)
  6.        en System.Windows.Forms.DataGridView.SortInternal(IComparer comparer, DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
  7.        en System.Windows.Forms.DataGridView.Sort(DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
  8.        en lib_empres.Principal.dgEmpresas_ColumnHeaderMouseClick(Object sender, DataGridViewCellMouseEventArgs e)
  9. etc etc etc

Última edición por sirurza; 02/09/2009 a las 07:31 Razón: Mejorar el post
  #2 (permalink)  
Antiguo 02/09/2009, 21:14
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 24 años, 1 mes
Puntos: 19
Respuesta: Linq Vs Datagridview.Datasource

Hola
Algo raro pasa, porque por lo menos yo al probar tirar una consulta con linq si me permite ordenar. Yo tenia el problema cuando a la datagrid le metia en el datasource una coleccion de objetos (por ejemplo una coleción de clientes) pero en varias pruebas que he hecho con linq y asingarlo a la datagrid funciona bien.

El error te lo da porque tenes que agregar unas intefaces para implementar los metodos, y es bastante lio implementarlo. De última lo que podes hacer son dos cosas.
Una es que captures el clic en la columna y veas en cual a hecho clic y generes de nuevo el linq y el order by sea en base a la columna seleccionada.

La otra es convertir tu linq y pasarlo a un datatable y asignarle el datatable a tu grilla
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #3 (permalink)  
Antiguo 03/09/2009, 01:24
Avatar de sirurza  
Fecha de Ingreso: julio-2009
Mensajes: 14
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Linq Vs Datagridview.Datasource

Es una solucion, segun he leido en MSDN hay una interfaz que en las colecciones de datos no la incorpora. El Datagrid por defecto si lo genera, pero como me pasa en LINQ Entity no.

Pase del tema y me centre en manipulacion de datos, quise dicer, partiendo de la propiedad autogenerate he descubierto que en verdad cuando le añades una coleccion analiza el objeto y genera la columna.
Tal que asi...
Código VB:
Ver original
  1. '# # # #
  2.            '# Con este sistema, recupero la esturcutra del Objeto del Entity
  3.            '# reduciendo el numero de sitios a cambiar, cuando manipule la base de datos
  4.            For Each p_obj As PropertyDescriptor In pr_obj
  5.                 If p_obj.IsBrowsable = True Then
  6.                     Dim col As New KryptonDataGridViewTextBoxColumn
  7.                     col.Name = p_obj.Name
  8.                     col.ValueType = p_obj.PropertyType
  9.                     'Select col.ValueType.Name
  10.                    '    Case "Decimal"
  11.                    '    Case "Else"
  12.                    '        'Case "String"
  13.                    '        'Case "Date"
  14.                    '        'Case "Datetime"
  15.                    'End Select
  16.                    dgEmpresas.Columns.Add(col)
  17.                 End If
  18.             Next
  19.             pr_obj = pr_obj
  20.  
  21.             For Each p_empres As din_empres In pr_empres
  22.                 Dim oArray As New ArrayList
  23.                 'pr_obj = TypeDescriptor.GetProperties(p_empres, True)
  24.                For Each p_obj As PropertyDescriptor In pr_obj
  25.                     If p_obj.IsBrowsable = True Then
  26.                         oArray.Add(p_obj.GetValue(p_empres))
  27.                     End If
  28.                 Next p_obj
  29.  
  30.                 dgEmpresas.Rows.Add(oArray.ToArray)
  31.             Next p_empres
  32.             '# # #
  #4 (permalink)  
Antiguo 04/09/2009, 11:10
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 24 años, 1 mes
Puntos: 19
Respuesta: Linq Vs Datagridview.Datasource

Hola
Si, lo de la interfaz es una solución pero por lo menos a mi cuando lo intente implementar no funciono. Es así, se le asignas a la grilla para que tome una colección de objetos no te funciona. Pero si no le decis que use una colecion de objetos y le pasas directamente el resultado del linq si funciona. Osea en la vista de diseño de la grilla le das en pestaña para seleccionar el datasource, ahí creo que debes seleccionar objeto de linq y selecciona la entidad de linq que necesites, por ejemplo empleados, luego hace como ahora la consulta y debería funcionar
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:24.