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!
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.
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!
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