Lady_Lilith Geschrieben 24. September 2008 Teilen Geschrieben 24. September 2008 Hallo Leute! Habe mal wieder ein Problem . . . unten seht ihr ein von mir erstelltes Programm, was aber noch nicht fertig ist . . . Folgendes: Ich habe eine Listbox, in diese sollen die Namen von Dateien rein. Verknüpft soll das Ganze mit einem Dataset sein . . . Ich brache also einen Verweis von der Liste (wenn ich ein Element anklicke) auf den Eintrag im Dataset (dort steht drin: Dateiname und - Pfad). Das ist dafür, dass wenn man auf Löschen klickt, man auch den Dataset-Eintrag löscht und nicht nur den Listbox-Eintrag. Und: Ich möchte beim Button Abbrechen das Fenster schließen, habe so ziemlich alles probiert (this.close, application.close oder ähnliches) Hier ein wenig vom Code: public void listBox_SelectedIndexChanged(object sender, EventArgs e) { //Hier kommen die ausgewählen Dateinamen rein object obj = listBox.ValueMember; } Int32 iCnt = 1; dsTable.Columns.Add("ID", Type.GetType("System.Int32")); dsTable.Columns.Add("Pfad", Type.GetType("System.String")); dsTable.Columns.Add("Name", Type.GetType("System.String")); foreach (string s in Pfade) { DataRow dr = dsTable.NewRow(); dr["ID"] = iCnt++; dr["Pfad"] = s; dr["Name"] = s.Substring(s.LastIndexOf("\\") + 1); dsTable.Rows.Add(dr); } //In die ListBox werden die Namen der Dateien geschrieben listBox.DataSource = ds.Tables["TBLPfade"]; listBox.DisplayMember = "Name"; listBox.ValueMember = "ID"; public void btnAbbr_Click(object sender, EventArgs e) { //Hier schließt man das Fenster } Wäre lieb, wenn ihr mir helfen würdet . . . Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaoru Geschrieben 24. September 2008 Teilen Geschrieben 24. September 2008 Hey Lady_Lilith, vorweg eine Frage: Warum benutzt du ein DataSet und nicht eine einfache DataTable als Datenquelle? So wie es aussieht benötigst du ja nur eine einzelne Tabelle. Zum Löschen der Daten brauchst du keinen extra Verweis auf den Eintrag im Dataset. Da das Dataset die Datenquelle deiner Listbox ist, sind die Elemente bereits verbunden. Wichtig ist es zu wissen, dass die Elemente aus deiner DataTable in deiner ListBox als DataRowView und nicht als DataRow vorhanden sind. Du kannst also über alle selektierten Einträge iterieren, mit Hilfe des DataRowViews die entsprechende DataRow herausfinden und diese dann aus der DataTable entfernen. Wurden die Einträge aus der DataTable entfernt, dann sollten sie auch automatisch aus der ListBox verschwinden. Zum Abbrechen Button: Schau mal, ob dein "btnAbbr_Click" Event auch tatsächlich dem Button zugewiesen ist. Die Funktionen, die du verwenden wolltest sind nämlich richtig. Gruß, Kaoru PS: Benutz beim nächsten mal bitte Code-Tags, dass macht das lesen einfacher Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 24. September 2008 Autor Teilen Geschrieben 24. September 2008 (bearbeitet) Hm, aber was muss ich denn dort ändern? Wenn ich derzeit dort auf Entfernen klicke, kommt die Meldung dass dies nicht geht, weil die Source festgelegt ist. public DataSet ds = new DataSet("DSPfade"); public void listBox_SelectedIndexChanged(object sender, EventArgs e) { //Hier kommen die ausgewählen Dateinamen rein object obj = listBox.ValueMember; } Int32 iCnt = 1; dsTable.Columns.Add("ID", Type.GetType("System.Int32")); dsTable.Columns.Add("Pfad", Type.GetType("System.String")); dsTable.Columns.Add("Name", Type.GetType("System.String")); foreach (string s in Pfade) { DataRow dr = dsTable.NewRow(); dr["ID"] = iCnt++; dr["Pfad"] = s; dr["Name"] = s.Substring(s.LastIndexOf("\\") + 1); dsTable.Rows.Add(dr); } //In die ListBox werden die Namen der Dateien geschrieben listBox.DataSource = ds.Tables["TBLPfade"]; listBox.DisplayMember = "Name"; listBox.ValueMember = "ID"; } public void btnEntf_Click(object sender, EventArgs e) { //Entfernt das angeklickte Element in der Liste (nur einzeln) //sollte es aber auch aus dem DataSet dann löschen listBox.Items.Remove(listBox.SelectedItem); } Bearbeitet 24. September 2008 von Lady_Lilith Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 25. September 2008 Autor Teilen Geschrieben 25. September 2008 (bearbeitet) Also gut . . . BtnAbbr klappt schonmal. Keine Ahnung, wieso es vorher nicht geklappt hat. habe einfach this.Close(); gemacht. Nur vorher wollte der nach dem Punkt das "Close" gar nicht anzeigen. So . . . Nun nochmal zu meinem DataSet . . . Ich habe also als Quelle der Listbox die Tabelle. listBox.DataSource = ds.Tables["TBLPfade"]; Erscheinen tun in der Listbox die Namen der Dateien listBox.DisplayMember = "Name"; Die Listbox ist also mit der Tabelle verbunden. Das erscheinen der Namen klappt auch soweit. Ich weiß nun nur nicht, wie ich das mit dem Löschen mache. Momentan steht da listBox.Items.Remove(listBox.SelectedItem); Aber wenn ich das so lasse, kommt ein Fehler: "Die Items-Auflistung kann nicht geändert werden, wenn die DataSource-Eigenschaft festgelegt ist." Was kann ich dagegen tun? Denn ich muss die Tabelle doch so mit der Listbox verbinden, oder nicht? Und dann gibt es da noch ein kleines Problem, dass man ja mehrmals auf den Hinzufügen-Button klicken können soll, und der dann sie Dateien einfach hinzufügt in das Dataset. Das funktioniert leider aber auch noch nicht, denn dort kommt die Meldung: "Eine DataTable mit dem Namen 'TBLPfade' gehört bereits zu diesem DataSet." Wie kann ich es hinbekommen, dass die Dateien einfach zu der Tabelle hinzugefügt werden? Ich möchte dann mit OK die Liste speichern, sodass sie danach erst auf Konvertieren klicken können. Viele liebe Grüße Bearbeitet 25. September 2008 von Lady_Lilith Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaoru Geschrieben 25. September 2008 Teilen Geschrieben 25. September 2008 Ich habe also als Quelle der Listbox die Tabelle. listBox.DataSource = ds.Tables["TBLPfade"]; richtig, wobei ich mich immernoch frage, warum du ein DataSet benutzt. Du kannst ein DataTable Objekt auch ohne DataSet verwalten. Wenn du nur die Tabelle "TBLPfade" benutzt und keine Funktionen aus dem DataSet brauchst, würde ich dir empfehlen, direkt die DataTable zu benutzen. Erscheinen tun in der Listbox die Namen der Dateien listBox.DisplayMember = "Name"; richtig listBox.Items.Remove(listBox.SelectedItem); falsch Du musst die Items nicht aus der ListBox sondern direkt aus der DataTable entfernen. Sobald sie nicht mehr in der Tabelle sind verschwinden sie auch automatisch aus der ListBox. "Eine DataTable mit dem Namen 'TBLPfade' gehört bereits zu diesem DataSet." Aus dem von dir geposteten Code kann ich leider die Stelle, die den Fehler wirft, nicht entnehmen. Aber ich tippe mal, dass du irgendwo folgendes stehen hast: dsTable = new DataTable(); dsTable.Name = "TBLPfade"; // Daten hinzufügen ds.Tables.Add(dsTable); Die Zeile "ds.Tables.Add(dsTable)" würde in diesem Fall den oben genannten Fehler werfen. Du musst die bereits in deinem DataSet vorhandene Tabelle bearbeiten, anstatt eine neue hinzuzufügen. Wenn du weiterhin das DataSet benutzen möchtest würde ich dir empfehlen eine "InitDataSet" Methode in deinen Code einzubauen, welche einmal (z.B. beim Laden der Form) aufgerufen wird. In dieser Mehtode initialisierst du dann dein DataSet und fügst eine leere Tabelle "TBLPfade" hinzu. Achtung: Auch die Definition der TableColumns muss dann in die Init Methode. Beim Hinzufügen der Daten greifst du dann direkt auf die Tabelle im DataSet zu und fügst wie gehabt die neuen Daten ein. Gruß, Kaoru Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 25. September 2008 Autor Teilen Geschrieben 25. September 2008 Sooo . . . aktueller Status: mehrmaliges Hinzufügen -> klappt! (kleine Einschränkung: er nimmt doppelt Dateien an) Löschen aus der Tabelle -> klappt! Konvertieren klappt noch nicht . . . Der macht aus zwei Tax Dateien eine Tax Datei mit komischen Zeichen drin. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.