Laden...

WPF bestimmte Zeile aus einer txt löschen

Erstellt von Blitzing vor einem Jahr Letzter Beitrag vor einem Jahr 508 Views
B
Blitzing Themenstarter:in
1 Beiträge seit 2022
vor einem Jahr
WPF bestimmte Zeile aus einer txt löschen

Moin,
ich habe eine ListBox deren Inhalt aus einer txt eingelesen wird, nun möchte ich aber wenn ein bestimmter Button gedrückt wird, das dass Programm jede einzelne Zeile der txt einzelnt durch liest und nur eine bestimmte Zeile löscht.
Beispielsweise in der txt und somit auch in der ListBox sind folgende dinge genau so aufgelistet:
Objekt1
Objekt2
Objekt3

Eine TextBox enthält den Text Objekt 2.
Wenn ich jetzt einen bestimmten Button drücke soll das Objekt2 nun aus der txt gelöscht werden.

Selbiges habe ich für eine ComboBox entsprechend Programmiert und das funktioniert auch, nur bei der ListBox irgendwie nicht.

In den folgenden Codes ist das Produkt in dem fall das Objekt 2

ComboBox Code, welcher funktioniert:


//Die enstprechende txt wird eingelesen
                StreamReader sr = new
                StreamReader(DropDowntxt, System.Text.Encoding.Default, true);
                sr.Close();

                //Die enstprechende txt wird eingelesen und in die löschung.txt überschreiben, bis der Stream bei der zulöschenden Zeile angekommen ist, da schließt er sich und durch else wird Stream wieder bei der nächsten Zeile aktiviert
                foreach (string line in System.IO.File.ReadAllLines(DropDowntxt))
                {
                    //löschung.txt wird beschrieben
                    FileStream fs = new FileStream(löschungtxt, FileMode.Append, FileAccess.Write);
                    StreamWriter sw = new StreamWriter(fs);

                    //Wenn Stream bei der zulöschenden Zeile angekommen ist schließt er sich und die Zeile wird nicht überschrieben
                    if (line == Produkt)
                    {
                        sw.Close();
                        fs.Close();
                    }
                    //Sonst wird die Zeile in die löschung.txt eingelesen und in Die enstprechende txt wieder überschrieben ohne die gelöschte Zeile
                    else
                    {
                        sw.WriteLine(line);
                        sw.Close();
                        fs.Close();
                        string[] löschungInhalt = File.ReadAllLines(löschungtxt);
                        File.WriteAllLines(DropDowntxt, löschungInhalt);
                    }
                }
                //DropDown Keine Auwahl wird ausgewählt
                string KeineAuswahl = "Keine Auswahl";
                lstDropDown.SelectedValue = KeineAuswahl;

                //Eigenschaftsfenster 
                lstEigenschaften.Items.Clear();

                //Das gelöschte Produkt wird in der DropDown gelöscht
                lstDropDown.Items.Remove(Produkt);

                //Der Zwischen Speicher wird gelöscht
                File.Delete(löschungtxt);
            }


ListBox Code welche nicht funktioniert:


//Die enstprechende txt wird eingelesen
                    StreamReader sr3 = new
                    StreamReader(MOtxt, System.Text.Encoding.Default, true);
                    sr3.Close();

                    //Die enstprechende txt wird eingelesen und in die löschung.txt überschreiben, bis der Stream bei der zulöschenden Zeile angekommen ist, da schließt er sich und durch else wird Stream wieder bei der nächsten Zeile aktiviert
                    foreach (string line in System.IO.File.ReadAllLines(MOtxt))
                    {
                        //löschung.txt wird beschrieben
                        FileStream fs = new FileStream(löschungtxt, FileMode.Append, FileAccess.Write);
                        StreamWriter sw = new StreamWriter(fs);

                        //Wenn Stream bei der zulöschenden Zeile angekommen ist schließt er sich und die Zeile wird nicht überschrieben
                        if (line == Produkt)
                        {
                            sw.Close();
                            fs.Close();
                        }
                        //Sonst wird die Zeile in die löschung.txt eingelesen und in Die enstprechende txt wieder überschrieben ohne die gelöschte Zeile
                        else
                        {
                            sw.WriteLine(line);
                            sw.Close();
                            fs.Close();
                            string[] löschungInhalt = File.ReadAllLines(löschungtxt);
                            File.WriteAllLines(MOtxt, löschungInhalt);

                            //Die lst wird aktualisiert
                            Orange = 0;
                            lstMeldungenOrange.Items.Clear();
                            foreach (string Inhalt in File.ReadLines(MOtxt))
                            {
                                lstMeldungenOrange.Items.Add(Inhalt);
                                Orange++;
                            }
                            string OrangeZahl = Convert.ToString(Orange);
                            string[] FarbenInhalt = File.ReadAllLines(Farbentxt);
                            File.WriteAllText(Farbentxt, FarbenInhalt[0] + Environment.NewLine + OrangeZahl + Environment.NewLine + FarbenInhalt[2]);
                            lblOrange.Content = OrangeZahl;
                        }
                        lstMeldungenOrange.Items.Remove(Produkt);
                        File.Delete(löschungtxt);
                        sw.Close();
                        fs.Close();
                    }

Ich wäre für jegliche Hilfe dankbar!

Hinweis von Abt vor einem Jahr

Auch Du bist herzlichst dazu eingeladen die wenigen Grundregeln von [Hinweis] Wie poste ich richtig? zu beachten und Deinen eigenen Code in Tags zu packen.
Niemand will einfach hingeklatschten Code lesen.

P
251 Beiträge seit 2010
vor einem Jahr

Hallo Blitzing!

Ich habe es jetzt mal ein wenig anders gelöst, da das für mich strukturierter ist.

Zum Prinziep:

Ich lese beim Start (des Windows) den Inhalt der TextBox-Datei in eine Variable und erstelle daraus eine (String) Liste:


private void ReadListBoxDatei(string ListBoxDatei)
{
    string DropDowntxt = File.ReadAllText(ListBoxDatei, Encoding.Default);  // ListBox-Datei in eine Variable einlesen
    ListBoxListe = DropDowntxt.Split(Environment.NewLine).ToList();         // Liste der ListBox-Einträge erstellen
    if(ListBoxListe.Count > 0) LöschEintrag = ListBoxListe[0];              // 1. Eintrag der Liste selektieren
}

Diese Liste lasse ich in einer ListBox anzeigen und stelle sie gleichzeitig einer ComboBox (zur Auswahl des Eintrages der gelöscht werden soll) zur Verfügung.

View:


<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="ListBox-Eintrag löschen" Height="150" Width="400">
    <Window.DataContext>
        <local:VMListBox/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="ListBox:" FontWeight="Bold" />
        <ListBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding ListBoxListe}" BorderBrush="Gray" BorderThickness="3" />
        <Label Grid.Row="0" Grid.Column="2" Content="Auswahl:" FontWeight="Bold" />
        <ComboBox Grid.Row="0" Grid.Column="3" ItemsSource="{Binding ListBoxListe}" VerticalAlignment="Top"
                  SelectedItem="{Binding LöschEintrag}"/>
        <Button Grid.Row="0" Grid.Column="4" Content="Löschen" Click="Button_Click" Margin="10,0,0,0" Padding="5" VerticalAlignment="Top" />
    </Grid>
</Window>


In meinem Fall kann der Benutzer einen Eintrag auswählen und löschen.

Beim Löschen lösche ich den relevanten Eintrag aus der Liste und schreibe die Liste wieder in die ListBox-Datei.


private void Button_Click(object sender, RoutedEventArgs e)
{
    VMListBox vm = (VMListBox)((Button)sender).DataContext;
    if(vm.LöschEintrag != null)                         // Einen zu löschenden Eintrag ausgewählt?
    {
        if(vm.ListBoxListe.Contains(vm.LöschEintrag))   // Ist der zu löschender Eintrag (noch) in der Liste vorhanden?
        {
            vm.ListBoxListe.Remove(vm.LöschEintrag);    // Ausgewählten Eintrag löschen
            vm.SaveListBoxDatei(vm.ListBoxDateiName);   // Geänderte Liste in die Datei schreiben
        }
    }
}

public void SaveListBoxDatei(string ListBoxDatei)
{
    string DropDowntxt = string.Empty;
    for (int i = 0; i < ListBoxListe.Count; i++)                            // Listbox-Liste iterieren
        DropDowntxt += ListBoxListe[i] + (i + 1 < ListBoxListe.Count ? Environment.NewLine : "");
    using (StreamWriter sw = new(ListBoxDatei, false, Encoding.Default)) { sw.Write(DropDowntxt); }       // Inhalt in die Datei schreiben
    ReadListBoxDatei(ListBoxDatei);                                         // ListBox-Datei wieder in eine Liste einlesen
}


Habe Fertig!

P
251 Beiträge seit 2010
vor einem Jahr

Hallo Blitzing!

Beim durchsehen deines Werkes ist mir noch aufgefallen, warum erstellst du eine Lösch-Datei, wenn du diese nur schreibst, um sie wieder einzulesen und dann löschst???
Dann kannst du auch gleich eine Variable benutzen!

Ich habe noch eine Lösung für dich erstellt, die nicht MVVM-konform ist, da du sowieso WPF ohne Binding's benutzt.


string löschInhalt = "Objekt2";             // Zeilen-Inhalt der gelöscht werden soll
string DateiNameLBInhalt = "MOtxt.txt";     // Dateiname der Datei die den ListBox-Inhalt enthält
string LBInhaltStrg = string.Empty;         // ListBox-Inhalt als String

List<string> LBInhalt = File.ReadAllLines(DateiNameLBInhalt).ToList();   // Datei-Inhalt in String-Liste einlesen
LBInhalt.Remove(löschInhalt);               // Lösch-Eintrag aus der Liste entfernen, wenn vorhanden
lstMeldungenOrange.ItemsSource = LBInhalt;  // Bereinigte Liste anzeigen
// Bereinigte Liste in die ListBox-Inhaltsdatei Datei (zurück) schreiben
for (int i = 0; i < LBInhalt.Count; i++)    // Listbox-Liste iterieren
    LBInhaltStrg += LBInhalt[i] + (i + 1 < LBInhalt.Count ? Environment.NewLine : "");   // Inhalt in String konvertieren
using StreamWriter sw = new(DateiNameLBInhalt, false, Encoding.Default); sw.Write(LBInhaltStrg);   // Inhalt in die Datei schreiben