none
ListView auswahl bearbeiten RRS feed

  • Frage

  • Ichmöchte gern alle ausgewählten Elemente aus einer ListView auf einmal entsprechend bearbeiten. In diesem Fall löschen es gibt jedoch ein Problem mit der foreach-Schleife.

            <ListView Margin="12,29,12,111" Name="listViewKeyWords" ItemsSource="{Binding KeyWords}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding SuchWort}" Header="Suchwort" Width="Auto" />
                        <GridViewColumn DisplayMemberBinding="{Binding Meldung}" Header="Meldung" Width="Auto" />
                    </GridView>
                </ListView.View>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding SuchWort}"/>
                            <TextBlock Text="{Binding Meldung}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    

            ObservableCollection<KeyWords> keyWords = new ObservableCollection<KeyWords>();
    
            public ObservableCollection<KeyWords> KeyWords
            {
                get { return keyWords; }
                set { keyWords = value; }
            }
    
            public MainWindow()
            {
                InitializeComponent(); 
                DataContext = this;
            }
    

     

        public class KeyWords
        {
            public string SuchWort { get; set; }
            public string Meldung { get; set; }
        }
    

                //Fehler: Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in mscorlib.dll aufgetreten.<br/>            //Zusätzliche Informationen: Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.<br/>            foreach (KeyWords item in listViewKeyWords.SelectedItems)
                {
                    keyWords.Remove(item);
                }
    

    Koopakiller - http://koopakiller.ko.ohost.de/
    Samstag, 14. Januar 2012 22:57
    Moderator

Antworten

  • Hallo,

    die meisten Enumeratoren mögen es gar nicht, wenn sich die zugrunde liegende Auflistung verändert
    während sie darüberlaufen, da sie dann nicht mehr ihre Position feststellen können.

    Da der Code nicht vollständig ist, gehe ich mal davon aus, Du willst über die SelectedItems löschen.
    Hier wird die gebundene Auflistung KeyWords verändert und somit auch die ausgewählten Elemente.

    Kopiere die ausgewählten Elemente zunächst in ein Array und lösche dann darüber:

        var selectedKeyWords = this.listViewKeyWords.SelectedItems.OfType<KeyWord>().ToArray();
        foreach (var item in selectedKeyWords)
        {
            Console.WriteLine("{0}", item.SuchWort);
            KeyWords.Remove(item);
        }
    
    

    Gruß Elmar

     

    Sonntag, 15. Januar 2012 00:03

Alle Antworten

  • Hallo,

    die meisten Enumeratoren mögen es gar nicht, wenn sich die zugrunde liegende Auflistung verändert
    während sie darüberlaufen, da sie dann nicht mehr ihre Position feststellen können.

    Da der Code nicht vollständig ist, gehe ich mal davon aus, Du willst über die SelectedItems löschen.
    Hier wird die gebundene Auflistung KeyWords verändert und somit auch die ausgewählten Elemente.

    Kopiere die ausgewählten Elemente zunächst in ein Array und lösche dann darüber:

        var selectedKeyWords = this.listViewKeyWords.SelectedItems.OfType<KeyWord>().ToArray();
        foreach (var item in selectedKeyWords)
        {
            Console.WriteLine("{0}", item.SuchWort);
            KeyWords.Remove(item);
        }
    
    

    Gruß Elmar

     

    Sonntag, 15. Januar 2012 00:03
  • Alles klar hat super funktioiert, vielen dank.
    Koopakiller - http://koopakiller.ko.ohost.de/
    Sonntag, 15. Januar 2012 10:07
    Moderator