Zum Inhalt springen

C# Dateiprogramm


Lady_Lilith

Empfohlene Beiträge

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

post-52366-14430448061055_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Lady_Lilith
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Lady_Lilith
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...