none
obtener valor de celda seleccionada DataGrid RRS feed

  • Pregunta

  • Buenas noches a todos. 

    Bueno, les comento. Para poder acceder al valor de una celda en un dataGridView lo hago de la siguiente manera.

    int codigo_hab = Convert.ToInt32(dgvHabitacionesTiempo.CurrentRow.Cells["Código Habitación"].Value.ToString());

    ahora, esto mismo lo necesito pero a nivel de WPF, esto es lo que tengo pero no lo necesito así ya que estoy recorriendo el dg.

    for (int i = 0; i <= dgvHabitaciones.Items.Count - 1; i++)
                        {
                           int codigo_hab = Convert.ToInt32((dgvHabitaciones.Items[i] as DataRowView).Row.ItemArray[1].ToString());
                        }

    como ya dije. no lo necesito así ya que estoy recorriendo el dg para poder obtener el valor. Lo que necesito es rescatar el valor de la celda al momento de seleccionarla...

    Alguien que sepa como hacer esto? la verdad es que he probado de todo pero no me funciona. Espero me puedan ayudar.

    Saludos a todos y gracias!!

    miércoles, 7 de marzo de 2018 1:00

Respuestas

  • El usuario ve la grilla, pero el programador ve mucho más.  Supongo que esa es la parte que no cabe en mi cabeza.  Para mí:  Si el usuario selecciona la segunda fila, yo sé que es la segunda fila del DataTable, o el segundo objeto de una colección.  El índice a usar es el mismo que el índice a usar sobre la grilla.

    Pero en fin, parece que generar una discusión acerca de esto no tiene sentido pues en un proyecto de prueba tipo WPF que hice para ayudarle con esto me hizo darme cuenta que no hay tal cosa como una propiedad Rows en el DataGrid.  Entonces no hay más remedio que hacer las cosas a través de la fuente de datos.

    Hay dos maneras:  Puede obtener el DataView original que asignó a la grilla a través de la propiedad ItemsSource, o bien existe la propiedad Items que es una lista de los elementos que corresponden a cada fila.  Si usó un DataView para alimentar la grilla, entonces cada item en Items es un DataRowView.  Si sabe que el código que busca está en la primera columna, entonces:

    //Obtener el código de la fila que el usuario ha seleccionado:
    int codigo_hab = Convert.ToInt32(((DataRowView)dgvHabitaciones.Items[dgvHabitaciones.SelectedIndex])[0]);
    Ah, y debo hacer notar que existe en DataGrid la propiedad SelectedItem, que es el equivalente a lo que puse en negrita arriba.


    Jose R. MCP
    Code Samples



    • Editado webJose miércoles, 7 de marzo de 2018 6:23
    • Marcado como respuesta Enrique Aleman miércoles, 7 de marzo de 2018 14:51
    miércoles, 7 de marzo de 2018 6:19
  • Buenas,

    Para lo que tu quieres, la propiedad que te devuelve la row seleccionada es 

    var dataGridRow = DataGrid.CurrentItem;

    Eso te devuelve la row completa que esta seleccionada.

    Si lo que quieres es la celda seleccionada:

    var dataCell = DataGrid.CurrentCell;

    y si lo que quieres es saber en numero de row seleccionada

    var nRow = DataGrid.Items.IndexOf(DataGridCurrentItem) + 1;

    Supongo que en tu caso, la opcion que quieres es la primera, ya que en la row tienes todas las columnas de esa row, que es lo que creo te interesa, quedandote algo asi:

    int codigo_hab = Convert.ToInt32((dgvHabitaciones.CurrentItem as DataRowView).Row.ItemArray[1].ToString());
    
    

    Con esa ultima linea que te he puesto, no necesitas iterar el datagrid

    Nos comentas si tienes dudas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Enrique Aleman miércoles, 7 de marzo de 2018 14:51
    miércoles, 7 de marzo de 2018 9:07

Todas las respuestas

  • Ok, según veo no gusta de mi sugerencia pues vuelve a preguntar lo mismo.  ¿Por qué obtener el valor directamente del DataTable no le sirve/gusta?

    Jose R. MCP
    Code Samples

    miércoles, 7 de marzo de 2018 2:19
  • Estimado, se me olvdó comentar en la otra pregunta que los datos que necesito tienen que ser del dgv ya que dependiendo de eso se hacen otras dos acciones más, dependiendo del dato obtenido de la celda, se hace unas o varias acciones. No sé si me explico con claridad.

    Saludos

    miércoles, 7 de marzo de 2018 2:29
  • Supongo que sí se explica.  Lo que yo no logro entender es cuál es la diferencia entre el ID obtenido del DataTable y el obtenido de la grilla.  La grilla es alimientada por el DataTable, así que los valores, al fin de cuentas deberían ser idénticos.  Esta es la parte que no comprendo.  Si pudiera explicarme esta parte, se lo agradeceré.

    Jose R. MCP
    Code Samples

    miércoles, 7 de marzo de 2018 2:33
  • Estimado, 

    la diferencia es la siguiente. Como bien dice los datos son los mismos ya que el DataTable alimenta el Grid pero en el DataTable yo no puedo ver gráficamente los datos, en el Grid si. Entonces, la acción es la siguiente, supongamos que hay 2 proyectos en la grilla, si selecciono la primera celda (donde está el código de dicho proyecto) hago una evaluación dependiendo de qué hay en otra celda, si el valor de la celda condicionante dince 'OK', entonces abro una ventana y/o acción para gestionar el OK, pero si dice 'NOK', entonces abro una ventana y/o acción para gestionar el NOK, se entiende?.

    El usuario debe hacer la acción y para ello debe ver qué proyecto está gestionando. en simples palabra, en la grilla el proyecto se ve, en el DataTable no. Espero haberme explicado de la mejor manera.

    Saludos

    miércoles, 7 de marzo de 2018 2:40
  • El usuario ve la grilla, pero el programador ve mucho más.  Supongo que esa es la parte que no cabe en mi cabeza.  Para mí:  Si el usuario selecciona la segunda fila, yo sé que es la segunda fila del DataTable, o el segundo objeto de una colección.  El índice a usar es el mismo que el índice a usar sobre la grilla.

    Pero en fin, parece que generar una discusión acerca de esto no tiene sentido pues en un proyecto de prueba tipo WPF que hice para ayudarle con esto me hizo darme cuenta que no hay tal cosa como una propiedad Rows en el DataGrid.  Entonces no hay más remedio que hacer las cosas a través de la fuente de datos.

    Hay dos maneras:  Puede obtener el DataView original que asignó a la grilla a través de la propiedad ItemsSource, o bien existe la propiedad Items que es una lista de los elementos que corresponden a cada fila.  Si usó un DataView para alimentar la grilla, entonces cada item en Items es un DataRowView.  Si sabe que el código que busca está en la primera columna, entonces:

    //Obtener el código de la fila que el usuario ha seleccionado:
    int codigo_hab = Convert.ToInt32(((DataRowView)dgvHabitaciones.Items[dgvHabitaciones.SelectedIndex])[0]);
    Ah, y debo hacer notar que existe en DataGrid la propiedad SelectedItem, que es el equivalente a lo que puse en negrita arriba.


    Jose R. MCP
    Code Samples



    • Editado webJose miércoles, 7 de marzo de 2018 6:23
    • Marcado como respuesta Enrique Aleman miércoles, 7 de marzo de 2018 14:51
    miércoles, 7 de marzo de 2018 6:19
  • Buenas,

    Para lo que tu quieres, la propiedad que te devuelve la row seleccionada es 

    var dataGridRow = DataGrid.CurrentItem;

    Eso te devuelve la row completa que esta seleccionada.

    Si lo que quieres es la celda seleccionada:

    var dataCell = DataGrid.CurrentCell;

    y si lo que quieres es saber en numero de row seleccionada

    var nRow = DataGrid.Items.IndexOf(DataGridCurrentItem) + 1;

    Supongo que en tu caso, la opcion que quieres es la primera, ya que en la row tienes todas las columnas de esa row, que es lo que creo te interesa, quedandote algo asi:

    int codigo_hab = Convert.ToInt32((dgvHabitaciones.CurrentItem as DataRowView).Row.ItemArray[1].ToString());
    
    

    Con esa ultima linea que te he puesto, no necesitas iterar el datagrid

    Nos comentas si tienes dudas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Enrique Aleman miércoles, 7 de marzo de 2018 14:51
    miércoles, 7 de marzo de 2018 9:07
  • Estimados, muchas gracias por el código que han puesto. Estoy trabajando ya así que no debería tener problemas.

    Perdón si no me exprese con claridad o si fui muy cerrado en entender la situación, pero muchas gracias.

    Saludos

    miércoles, 7 de marzo de 2018 14:52