elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Limpiar datagrid vinculado a un ObservableCollection - WPF
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Limpiar datagrid vinculado a un ObservableCollection - WPF  (Leído 1,467 veces)
TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Limpiar datagrid vinculado a un ObservableCollection - WPF
« en: 6 Marzo 2024, 12:35 pm »

Tengo un datagrid (CalculoRutas) que se alimenta de un ObservableCollection con el siguiente método:

Metodo:

Código
  1.  
  2. void miMetodo
  3.        private void MatrizRutas_Checked(object sender, RoutedEventArgs e)
  4.        {
  5.            try
  6.            {
  7.                if (GenerarRutas.SelectedItems.Count > 0)
  8.                {
  9.                    foreach (var selectedItem in GenerarRutas.SelectedItems)
  10.                    {
  11.  
  12.                        PatrullasRutas.Items.Add(selectedItem);
  13.  
  14.                        vmRutas.LimpiarRutasPatrullas();
  15.  
  16.                    }
  17.                }
  18.            }
  19.            catch (Exception a)
  20.            {
  21.  
  22.                MessageBox.Show(a.Message);
  23.            }
  24.  
  25.        }
  26.  


Clase:

Código
  1. public class ViewModelRutas
  2. {
  3.    public ObservableCollection<Patrulla> RutasPatrullas { get; set; }
  4.  
  5.    public ViewModelRutas()
  6.    {
  7.  
  8.        RutasPatrullas = GeneratePatrullas();
  9.  
  10.    }
  11.  
  12.    private ObservableCollection<Patrulla> GeneratePatrullas()
  13.    {
  14.        try
  15.        {
  16.               //Más código
  17.  
  18.               public void LimpiarRutasPatrullas()
  19.               {
  20.                     RutasPatrullas.Clear();
  21.               }
  22.  
  23.        }
  24.        catch (Exception e)
  25.        {
  26.            MessageBox.Show("MainWindowViewModel " + e.Message);
  27.            return null;
  28.        }
  29.    }
  30.  
  31. }

El problema es que cuando llamo al LimpiarRutasPatrullas, me limpia el DataGrid pero me lanza un error: "Colección modificada; puede que no se ejecute la operación de enumeración" ocurre cuando intentas modificar una colección mientras estás en medio de un bucle de enumeración (por ejemplo, mientras estás iterando sobre los elementos de la colección)"

He probado poner el datagrid (CalculoRutas.ItemSource=null) y da el mismo error.

¿Alguna idea de como puedo solventarlo?

Saludos


« Última modificación: 6 Marzo 2024, 12:47 pm por TrashAmbishion » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Limpiar datagrid vinculado a un ObservableCollection - WPF - Solucionado
« Respuesta #1 en: 6 Marzo 2024, 12:48 pm »

Solo añadí un break; seguido de vmRutas.LimpiarRutasPatrullas(); y listo..


Saludos


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Limpiar datagrid vinculado a un ObservableCollection - WPF
« Respuesta #2 en: 6 Marzo 2024, 17:09 pm »

añadí un break; seguido de vmRutas.LimpiarRutasPatrullas(); y listo..

Hola. ¿Te das cuenta que al añadir la sentencia break para interrumpir el ciclo del bucle foreach, solamente acabarás iterando y añadiendo el primer elemento de la colección GenerarRutas.SelectedItems del DataGrid?. Usar un bucle pierde todo el sentido si añades un break de la forma en la que lo detallas, sin criterio / condición específica.

Indiferentemente de eso, el código que has mostrado es algo confuso ya que hay dos miembros con nombre idéntico donde solo cambia el orden de las palabras: PatrullasRutas y RutasPatrullas.

En cualquier caso, con el método vmRutas.LimpiarRutasPatrullas() alteras una colección eliminando todos sus elementos, lo haces en cada iteración del bucle. No hay necesidad. Simplemente mueve ese método fuera del bucle foreach y el problema se debería solucionar.

No puedes iterar una colección al mismo tiempo que la alteras añadiendo o eliminando elementos en la misma. En esos casos se puede recurrir a generar una copia de la colección original para iterar los elementos de la copia y realizar las operaciones de adición o eliminación de elementos en la original.

No manejo WPF, pero si te siguiese dando error entonces haz una copia del objeto selectedItem al añadir dicho elemento en el bucle: PatrullasRutas.Items.Add(copia de selectedItem);.

Aténtamente,
Elektro.
« Última modificación: 6 Marzo 2024, 17:34 pm por Eleкtro » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.357


Ver Perfil
Re: Limpiar datagrid vinculado a un ObservableCollection - WPF
« Respuesta #3 en: 8 Marzo 2024, 01:37 am »

Si en un bucle quieres eliminar todos los ítems, tienes que hacerlo de una de estas dos formas:

- Desde el final hacia atrás... (porque no queda ninguno huérfano por culpa de una eliminación en medio, que sea preciso atender... según sea el caso conforme al tipo de colección operada).
- Eliminado siempre el item primero (de dicha colección). Porque tras ser eliminado, el siguiente pasa a ser el primero (Esto sin embargo suele comportar más trabajo interno de reasignación de valores (internos), el caso previo este tipo de operación minimiza esto, pues suele limitarse a descontar la cantidad total de ítems y ya).

Nota que añadir y eliminar en un mismo bucle aunque es posible debes tener bien claro la posición que tiene en todo momento cada cual, de lo contrario, es posible que acabes eliminado items que previamente has añadido y por lo tanto cuando revises el resultado final, no consten los que tú pretendías que quedaran.

Considera, piensa en qué sucede con los ítems por encima (o hijos de) a uno dado cuando eliminas o cuando insertas conforme al tipo de colección que estés usando. Por ejemplo si es una lista enlazada, un array, un árbol, una tabla hash, etc...


...y sí, mirando el código ocurre como te dice Elektro, recorres en un bucle enumerado añadiendo ítems, para acto seguido dar una orden de borrar (el contenido de) la colección en la que se ha insertado el item seleccionado, no tierne sentido, o bien no precisas añadir nada, o bien no tiene sentido que los borres, al menos no con cada añadido, en todo caso al final (y una sola vez), además estás borrando de  'PatrullasRutas', no de la colección 'GenerarRutas'... que es quizás tu objetivo...

Quizás no tengas muy claro que quieres hacer, o por lo menos como debes hacerlo. si al menos indicaras cual es tu objetivo final, se te podría indicar las pautas a seguir, pero preguntas por un error sin dejar claro que es lo que pretendes que haga tu código.
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Limpiar datagrid vinculado a un ObservableCollection - WPF
« Respuesta #4 en: 11 Marzo 2024, 08:27 am »

Hola. ¿Te das cuenta que al añadir la sentencia break para interrumpir el ciclo del bucle foreach, solamente acabarás iterando y añadiendo el primer elemento de la colección GenerarRutas.SelectedItems del DataGrid?. Usar un bucle pierde todo el sentido si añades un break de la forma en la que lo detallas, sin criterio / condición específica.

Indiferentemente de eso, el código que has mostrado es algo confuso ya que hay dos miembros con nombre idéntico donde solo cambia el orden de las palabras: PatrullasRutas y RutasPatrullas.

En cualquier caso, con el método vmRutas.LimpiarRutasPatrullas() alteras una colección eliminando todos sus elementos, lo haces en cada iteración del bucle. No hay necesidad. Simplemente mueve ese método fuera del bucle foreach y el problema se debería solucionar.

No puedes iterar una colección al mismo tiempo que la alteras añadiendo o eliminando elementos en la misma. En esos casos se puede recurrir a generar una copia de la colección original para iterar los elementos de la copia y realizar las operaciones de adición o eliminación de elementos en la original.

No manejo WPF, pero si te siguiese dando error entonces haz una copia del objeto selectedItem al añadir dicho elemento en el bucle: PatrullasRutas.Items.Add(copia de selectedItem);.

Aténtamente,
Elektro.

Gracias por los tips... le estoy dando una vuelta para darle el enfoque que dices..
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Limpiar datagrid vinculado a un ObservableCollection - WPF
« Respuesta #5 en: 11 Marzo 2024, 08:28 am »

Si en un bucle quieres eliminar todos los ítems, tienes que hacerlo de una de estas dos formas:

- Desde el final hacia atrás... (porque no queda ninguno huérfano por culpa de una eliminación en medio, que sea preciso atender... según sea el caso conforme al tipo de colección operada).
- Eliminado siempre el item primero (de dicha colección). Porque tras ser eliminado, el siguiente pasa a ser el primero (Esto sin embargo suele comportar más trabajo interno de reasignación de valores (internos), el caso previo este tipo de operación minimiza esto, pues suele limitarse a descontar la cantidad total de ítems y ya).

Nota que añadir y eliminar en un mismo bucle aunque es posible debes tener bien claro la posición que tiene en todo momento cada cual, de lo contrario, es posible que acabes eliminado items que previamente has añadido y por lo tanto cuando revises el resultado final, no consten los que tú pretendías que quedaran.

Considera, piensa en qué sucede con los ítems por encima (o hijos de) a uno dado cuando eliminas o cuando insertas conforme al tipo de colección que estés usando. Por ejemplo si es una lista enlazada, un array, un árbol, una tabla hash, etc...


...y sí, mirando el código ocurre como te dice Elektro, recorres en un bucle enumerado añadiendo ítems, para acto seguido dar una orden de borrar (el contenido de) la colección en la que se ha insertado el item seleccionado, no tierne sentido, o bien no precisas añadir nada, o bien no tiene sentido que los borres, al menos no con cada añadido, en todo caso al final (y una sola vez), además estás borrando de  'PatrullasRutas', no de la colección 'GenerarRutas'... que es quizás tu objetivo...

Quizás no tengas muy claro que quieres hacer, o por lo menos como debes hacerlo. si al menos indicaras cual es tu objetivo final, se te podría indicar las pautas a seguir, pero preguntas por un error sin dejar claro que es lo que pretendes que haga tu código.

Gracias, le doy una vuelta para revisar nuevamente...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines