Ayuda control DataGrid .net WPF

Hola, estoy intentando configurar un control datagrid "manualmente" en WPF y no encuentro la forma. Decir quees la primera vez que desarrollo una aplicacion en .net( bueno y casi que es la primera que desarrollo completamente puesto que es para el PFC,xdd). De entrada tuve que instalar el WPFToolKit de CodePlex para utilizar un control Datagrid ya que WPF no incluye estos controles.

Mirando ejemplos he encontrado que se utiliza la propiedad ItemSource del Datagrid para asignarle una fuente de datos.
Si hago :
datagrid1.ItemSource=Cliente.ObtenerUsuarios();

Me carga en el datagrid todos los usuarios y todos sus campos. El problema es que no quiero todos los campos y quiero poder configurar el datagrid "a mano", poner le numero de columnas y filas que me interese.Lo he intentado pero no encuentor la forma de hacerlo.

Alguien me puede ayudar???

Saludos
Deberias preguntarlo en PC. Quizás en el subforo de "Software Libre" alguien te eche una mano. A mi de Java preguntame lo que quieras pero de .net....
Saludos
Ok, a ver si un moderador lo puede mover allí.

Saludos
Las columnas (creo) tienen una propiedad que se llama Visible para que se muestren o no. Las filas si tienen una fuente de datos no estoy tan seguro de si se pueden quitar.

Yo acabé usando el DataGridView del Framework 2.0, he estado probando con la DataGrid de ese Toolkit y me parecía menos flexible y con menos opciones que el DataGridView.

Mucha suerte :)
nayru2000 escribió:Las columnas (creo) tienen una propiedad que se llama Visible para que se muestren o no. Las filas si tienen una fuente de datos no estoy tan seguro de si se pueden quitar.

Yo acabé usando el DataGridView del Framework 2.0, he estado probando con la DataGrid de ese Toolkit y me parecía menos flexible y con menos opciones que el DataGridView.

Mucha suerte :)


La unica solucion que he encontrado es que una vez obtiene los datos, elimino las columnas que me interese pero queda un poco "guarro". Por ejemplo, para eliminar la primera columna que me carga algo raro:
dataGrid1.Columns.RemoveAt(0);

Como utilizo en WPF el DataGridView que comentas???

Saludos
A verr, jamás pensé en ver un post sobre wpf en eol, pero bue.

La idea está para empezar en que desactives el AutoGenerateColumns, asi tendrás la posibilidad de poner las columnas que quieras.

No sé que devolverá tu método, pero lo suyo es que uses ObservableCollection que te permitirá borrar elementos usando supr, añadir nuevos, editar...

Por otro lado, para crear las columnas que necesites sería en plan:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding TuLista}">
          <DataGrid.Columns>
             <DataGridTextColumn Header="Columna 1" Binding="{Binding Columna1}" />
             <DataGridTextColumn Header="Columna 3" Binding="{Binding Columna3}" />
             <DataGridTextColumn Header="Columna 10" Binding="{Binding Columna10}" IsReadOnly="True"/>
          </DataGrid.Columns>
       </DataGrid>


Esto es un ejemplo. Es importante que te familiarices con XAML y evitar hacer las cosas con código siempre que puedas.

El tema es simple, haces un binding a tu lista de elementos, luego cada columna tendrá como contexto un elemento de esa lista, ese elemento tendrá propiedades (que son las columnas) pues simplemente "bindeas" las columnas que necesites.

Si tienes más dudas, preguntame, pero tampoco intentes correr mucho por terreno desconocido.
haz una select con los datos que quieras cargar a un dataset y ese dataset lo puedes mostrar en tu datagrid sin problema.

si no sabes lo que es un dataset mira en internet, te lo explicara mas rapido de lo que yo pueda hacer.
Fox escribió:A verr, jamás pensé en ver un post sobre wpf en eol, pero bue.

La idea está para empezar en que desactives el AutoGenerateColumns, asi tendrás la posibilidad de poner las columnas que quieras.

No sé que devolverá tu método, pero lo suyo es que uses ObservableCollection que te permitirá borrar elementos usando supr, añadir nuevos, editar...

Por otro lado, para crear las columnas que necesites sería en plan:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding TuLista}">
          <DataGrid.Columns>
             <DataGridTextColumn Header="Columna 1" Binding="{Binding Columna1}" />
             <DataGridTextColumn Header="Columna 3" Binding="{Binding Columna3}" />
             <DataGridTextColumn Header="Columna 10" Binding="{Binding Columna10}" IsReadOnly="True"/>
          </DataGrid.Columns>
       </DataGrid>


Esto es un ejemplo. Es importante que te familiarices con XAML y evitar hacer las cosas con código siempre que puedas.

El tema es simple, haces un binding a tu lista de elementos, luego cada columna tendrá como contexto un elemento de esa lista, ese elemento tendrá propiedades (que son las columnas) pues simplemente "bindeas" las columnas que necesites.

Si tienes más dudas, preguntame, pero tampoco intentes correr mucho por terreno desconocido.


Te explico un poco lo que quiero hacer. Tengo una base de datos con Usuarios que hacen Peticiones de servicios,Inscripciones a actividades y Reservas de recursos.
Una vez el usuario ha entrado en la aplicacion se le muestra una ventana en la que en un lado tengo 3 checkbox(Peticiones,Inscripciones i Reservas) y el datagrid. Cuando selecciona un checkbox quiero mostrar la informacion correspondiente en el datagrid. Los metodos que devuelven los datos son:
-List<Reserva>ObtenerReservasUsuario(string nombre)
-List<Inscripcion>ObtenerInscripcionesUsuario(string nombre)
-List<Peticion>ObtenerPeticionesUsuario(string nombre)
donde Reserva,Inscripcion i Peticion son la representacion de las tablas de la bbdd en las clases que me ha generado Linq2sql.

Saludos
Vamos a ver, esos métodos estaria mejor si en vez de List devolvieran la interfaz, IList, pero bueno, el caso es que trabajes con ObservableCollection

Puedes hacer algo en plan:

ObservableCollection<Reserva> reservas = new ObservableCollection<Reserva>(ObtenerReservasUsuario());


Lo _dificil_ está en cambiar el datagrid en tiempo de ejecución.

No es que sea dificil como tal, simplemente tendrás que cambiar las columnas dinámicamente cuando hagas click en un checkbox.

Ya todo depende de lo pegado que estes o no con WPF jeje.

Pero el caso es fácil, necesitas un ObservableCollection, una propiedad para dicho ObservableCollection (que usarás como ItemsSource de la tabla) y luego cada columna la "bindeas" a las propiedades de cada objeto que esté en el ObservableCollection.

Podrías crearte algun método para que cree las columnas en tiempo de ejecución y se vayan cambiando, es mejor que tener 3 datagrids.

Realmente sería interesante alguna forma de que el datagrid supiera que columnas quieres y las genere automaticamente, te solucionaría todo el problema, aunque ahora mismo no caigo en como se podría hacer.
Fox escribió:Vamos a ver, esos métodos estaria mejor si en vez de List devolvieran la interfaz, IList, pero bueno, el caso es que trabajes con ObservableCollection

Puedes hacer algo en plan:

ObservableCollection<Reserva> reservas = new ObservableCollection<Reserva>(ObtenerReservasUsuario());


Lo _dificil_ está en cambiar el datagrid en tiempo de ejecución.

No es que sea dificil como tal, simplemente tendrás que cambiar las columnas dinámicamente cuando hagas click en un checkbox.

Ya todo depende de lo pegado que estes o no con WPF jeje.

Pero el caso es fácil, necesitas un ObservableCollection, una propiedad para dicho ObservableCollection (que usarás como ItemsSource de la tabla) y luego cada columna la "bindeas" a las propiedades de cada objeto que esté en el ObservableCollection.

Podrías crearte algun método para que cree las columnas en tiempo de ejecución y se vayan cambiando, es mejor que tener 3 datagrids.

Realmente sería interesante alguna forma de que el datagrid supiera que columnas quieres y las genere automaticamente, te solucionaría todo el problema, aunque ahora mismo no caigo en como se podría hacer.


Como te comentaba en el MP, es la primera vez que utilizo todo esto y no me suena de nada ObservableCollection ni Binding,xdd
Tengo un método que se llama cargardatagrid() que se ejecuta en cuanto se marca cualquiera de los tres RadioButton( antes me he colado y he puesto CheckBox y son RadioButton, para que solo pueda seleccionar uno al mismo tiempo).Tambien tengo un atributo de tipo string que dependiendo del rbutton que hayan seleccionado contendrá "reservas","inscripciones" o "peticiones". El metodo CargarDataGrid() comprueba que valor hay en el string y me conecto al servicio y pido ObtenerResrvas,Inscripciones o Peticiones del usuario.

Saludos

PD:QUe ventajas hay en devolver en vez de List IList??? Supongo que todavia estaria a tiempo de cambiarlo si fuese necesario.
El problema es que es dificil ayudarte si no sabes bien lo que estás tocando.

La idea está en que el evento que dices que tienes con los RadioButtons, lo uses para crear las columnas. Un metodo al que le pasas la info de las columnas, borra las que hay y genera nuevas.

El problema es que si no sabes que es un Binding (lo más básico en WPF), creo que te has equivocado. Podrías haber usado algo más simple pero has tirado por WPF que es bastante más complejo al principio y no me extraña que te des de bruces contra la pared.

A tu PD, hay un principio de programación que decía algo así: Nunca trabajes con una implementación concreta, trabaja para la interfaz.

En tu caso, no necesitas trabajar con List, puedes trabajar con la interfaz así ese código lo podrá usar otras colecciones que implementen IList y no sean LIST.

Sobre tu tema, me temo que vas a tener que dejar de construir el tejado y empaparte de wpf un poco.
Fox escribió:El problema es que es dificil ayudarte si no sabes bien lo que estás tocando.

La idea está en que el evento que dices que tienes con los RadioButtons, lo uses para crear las columnas. Un metodo al que le pasas la info de las columnas, borra las que hay y genera nuevas.

El problema es que si no sabes que es un Binding (lo más básico en WPF), creo que te has equivocado. Podrías haber usado algo más simple pero has tirado por WPF que es bastante más complejo al principio y no me extraña que te des de bruces contra la pared.

A tu PD, hay un principio de programación que decía algo así: Nunca trabajes con una implementación concreta, trabaja para la interfaz.

En tu caso, no necesitas trabajar con List, puedes trabajar con la interfaz así ese código lo podrá usar otras colecciones que implementen IList y no sean LIST.

Sobre tu tema, me temo que vas a tener que dejar de construir el tejado y empaparte de wpf un poco.


gracias por contestar.
En cuanto a WPF yo no lo escogí , en el TFC que me tocó es requisito insdispensable utilizar LINQ,WCF y WPF.

Voy a ver que averiguo.

Saludos
11 respuestas