none
Recorrer un DataGrid desde código C# RRS feed

  • Pregunta

  • Hola:

    ¿Cómo puedo recorrer un DataGrid desde código C#?

    Tengo un datagrid, en el cual necesito revisar ciertas campos de cada fila.

    De por sí, el datagrid tiene un ItemsSource que es un List<Clase>.

    En la grilla voy modificando distintos campos de cada registro, y la idea es que al presionar un botón, llamado "Guardar", quiero tomar todas las filas del datagrid, e ir viendo los campos que necesito ver de cada fila.

    Gracias.


    Sergio

    martes, 21 de mayo de 2013 1:07

Respuestas

  • En xaml:
    <DataGridTextColumn Binding="{Binding Path=Media}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontStyle="Italic" Header="Media" IsReadOnly="False" />
                                        <DataGridTextColumn Binding="{Binding Path=Errorq}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontStyle="Italic" Header="Error Indicación" IsReadOnly="False" />
    <DataGridTextColumn Binding="{Binding Path=Errorb}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontStyle="Italic" Header="Error Repetibilidad" IsReadOnly="False" />
                                            
                                            
                                            
    Y en C#
    List<Errores> errores = new List<Errores>();
    foreach (DataRowView fila in dataGridSeries.Items) 
                {
                    errores.Add(Calculos.Error(fila));
                }
                dataGridErrores.ItemsSource = errores;



    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    • Marcado como respuesta Budokan1987 lunes, 27 de mayo de 2013 22:36
    viernes, 24 de mayo de 2013 8:36

Todas las respuestas

  • Hola.

    Para recorrer un DataGrid yo lo he conseguido así.

    foreach (DataRowView fila in datagrid1.Items)
    { 
    foreach ( DataColumn columna in fila.DataView.Table.Columns)
    {
    String contenidodelacolumna=Fila[columna.ToString()].ToString();
    }
    }
    

    Creo que el código está bien pero lo he escrito sobre la marcha puede que tenga algún error de sintaxis.



    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    martes, 21 de mayo de 2013 9:03
  • Para recorrer.

    foreach(Clase item in dataGrid1.Items) { MessageBox.Show(item.Property.ToString()); }

    Para obtener el registro seleccionado.

    MessageBox.Show(((Clase)dataGri1.SelectedItem).Property.ToString());

    miércoles, 22 de mayo de 2013 11:53
  • Hola TonyAns:

    Intenté con tu método. Funciona. El problema es que cuando voy modificando las columnas de una fila (cambiando sus valores), y recorro el datagrid, los cambios no se muestran, sino que se muestran los valores que por defecto tiene la grilla.

    Gracias.


    Sergio

    • Propuesto como respuesta Rodripelto jueves, 23 de mayo de 2013 14:46
    miércoles, 22 de mayo de 2013 20:09
  • Hola Rodripelto:

    Probé la solución que me diste. Sin embargo no resulta. El error que sucede en la ejecución es el siguiente:

    No se puede convertir un objeto de tipo 'CobroAsociado' al tipo 'System.Data.DataRowView'.

    CobroAsociado es una clase. Tengo una List<CobroAsociado> que es el ItemsSource del datagrid.

    Gracias.


    Sergio

    miércoles, 22 de mayo de 2013 20:12
  • Hola.

    Siento no haberte ayudado mi Datagrid lo tengo enlazado a una clase que contiene 2 datatabled y será por eso que puedo convertirlo en dataRowView.

    Por otro lado comentas:

    El problema es que cuando voy modificando las columnas de una fila (cambiando sus valores), y recorro el datagrid, los cambios no se muestran, sino que se muestran los valores que por defecto tiene la grilla.

    ¿A que te refieres que se muestran los valores por defecto? Es que te muestra los valores de antes de la edición.

    Si es así ¿en que evento o momento recorres el DataGrid ? te lo pregunto porque yo he tenido un problema parecido en el evento CellEditEnding y quizá esta vez si pueda ayudarte.

     

    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    jueves, 23 de mayo de 2013 8:16
  • Hola Rodripelto:

    El datagrid está enlazado a una lista de objetos, que son instancias de una clase que he hecho.

    A eso me refiero a que solo muestra los valores por defecto. Hago en Binding entre la grilla y la lista. Cuando modifico la grilla y deseo recorrerla, quiero que se muestren los nuevos valores. Sin embargo, se muestran los que trae por defecto.

    Gracias.


    Sergio

    jueves, 23 de mayo de 2013 14:08
  • Pues he probado como dice TonyAns y funciona perfecto.

    private void buttonSigno_Click(object sender, RoutedEventArgs e)
            {
                foreach (Errores item in dataGridErrores.Items) 
                {
                    double b= item.Errorb;
                    double q = item.Errorq;
                    double m = item.Media;
                }

    Mi clase Errores tiene tres propiedades Errorb, Errorq y Media y las actualiza perfecto y ese DataGrid esta cargado con una List<Errores>

    dataGridErrores.ItemsSource = errores;

    Pebiamente he cargado errores con objetos de la Clase Errores


    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    jueves, 23 de mayo de 2013 15:43
  • Rodripelto, gracias por responder.

    ¿Me podrías mostrar la forma en que haces el Binding, o enlace, entre el DataGrid y el List? Creo que en ese punto estoy fallando :/.

    Gracias.


    Sergio

    viernes, 24 de mayo de 2013 0:06
  • En xaml:
    <DataGridTextColumn Binding="{Binding Path=Media}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontStyle="Italic" Header="Media" IsReadOnly="False" />
                                        <DataGridTextColumn Binding="{Binding Path=Errorq}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontStyle="Italic" Header="Error Indicación" IsReadOnly="False" />
    <DataGridTextColumn Binding="{Binding Path=Errorb}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontStyle="Italic" Header="Error Repetibilidad" IsReadOnly="False" />
                                            
                                            
                                            
    Y en C#
    List<Errores> errores = new List<Errores>();
    foreach (DataRowView fila in dataGridSeries.Items) 
                {
                    errores.Add(Calculos.Error(fila));
                }
                dataGridErrores.ItemsSource = errores;



    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    • Marcado como respuesta Budokan1987 lunes, 27 de mayo de 2013 22:36
    viernes, 24 de mayo de 2013 8:36
  • Hola Rodripelto:

    Logré hacerlo. Pero hay algo que me llama mucho la atención. Bueno te comento, que simplemente agregué el Path en el Binding, pues antes solamente tenía Binding={Binding NombreCampo}. Ahora lo deje de la misma forma en que tu lo tienes, Binding={Binding Path=NombreCampo}.

    Era una tontera, pero al fin y al cabo, era algo que ignoraba. Mi pregunta es, ¿qué hace el Path?

    Por lo demás. gracias por tu tiempo en ayudarme. Valoro eso.

    Saludos!


    Sergio

    viernes, 24 de mayo de 2013 16:16
  • Mira he encontado esta esplicación en la red.

    Hay una diferencia importante en este caso que se ejecutará en cuanto se tiene una trayectoria propiedad compleja con parámetros con tipo.

    Conceptualmente son equivalentes, ya que ambos terminan estableciendo el Binding.Path , una a través del parametrizado Binding constructor , el otro directamente a través de la propiedad. Lo que ocurre internamente es muy diferente, ya que el Binding.Path no es sólo una cadena que en ambos casos se pasa a la propiedad, es un PropertyPath .

    Cuando XAML se analizan los convertidores de tipos se utilizan para convertir cadenas en los tipos previstos por las propiedades. Así que cuando usted utiliza Path= un PropertyPathConverter se creará una instancia para analizar la cadena y devolver un PropertyPath . Ahora aquí está la diferencia:

    (En el caso de la Binding constructor Object[] estará vacía)

    ¿Cómo funciona este asunto?

    Si, por ejemplo, tiene varios indizadores de una clase por ejemplo, uno que espera una string y que espera un int y se intenta convertir el valor para atacar este último el elenco no funcionará:

     {Binding [(sys:Int32)0]} 

    El PropertyPath carece de la ITypeDescriptorContext porque el constructor público se invoca lo que el tipo System.Int32 no se puede resolver de la cadena sys:Int32 .

    Si utiliza Path= sin embargo, el convertidor de tipos se utilizará el tipo de cambio y se resolverá mediante el contexto, por lo que esto va a funcionar:

     {Binding Path=[(sys:Int32)0]} 

    Por lo tanto entiedo que en tu enlace de datos la asignacion del objeto a datagrid lo hacia correcto pero del datagrid al objeto fallaba. Por lo tanto creo que mejor usar Path siempre.

    P.D. Marca alguna respuesta como valida pare que se sepa que se soluciono tu problema


    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    • Editado Rodripelto viernes, 24 de mayo de 2013 18:09
    viernes, 24 de mayo de 2013 17:46