PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#-FileStream-Einträge in ListBoxen schreiben


The Keeper
2009-12-03, 20:08:20
Hallo,
ich versuche mich gerade an der Programmierung eines Telefonbuchs.
Dabei werden Name und Nummer via FileStream in eine Datei geschrieben und einzeln in ListBoxen ausgegeben.
Ich habe vorsichtshalber die GUI angehängt.
Die Gruppe "Datenbankverbindung" einfach nicht beachten.
Dies ist der Code, mit dem ich die Daten in eine Datei schreibe:

private void b_save_Click(object sender, EventArgs e)
{
try
{
CSatz class_csatz = new CSatz();

FileStream fs_filepath = new FileStream("F:\\database\\phonebook.phb", FileMode.Append, FileAccess.Write);
BinaryFormatter bf_strom = new BinaryFormatter();

class_csatz.var_number = Convert.ToInt32(tb_number.Text);
class_csatz.var_name = tb_name.Text;
class_csatz.var_bname = tb_bname.Text;
class_csatz.var_id = var_lastid + 1; //damit jeder Datensatz eine eindeutige ID besitzt

var_lastid = var_lastid + 1; //Zählvariable für neuen Eintrag erhöhen

bf_strom.Serialize(fs_filepath, class_csatz);

fs_filepath.Close();
}

catch (Exception)
{
MessageBox.Show("Eingabe überprüfen!");
}
}

Und damit lese ich es wieder aus:


private void b_sort_Click(object sender, EventArgs e)
{

FileStream fs_filepath = new FileStream("F:\\database\\phonebook.phb", FileMode.Open, FileAccess.Read);
BinaryFormatter bf_strom = new BinaryFormatter();

CSatz class_csatz = new CSatz();

class_csatz = (CSatz)bf_strom.Deserialize(fs_filepath);

fs_filepath.Seek(var_pos, 0);
lb_nachname.Items.Add(class_csatz.var_name);
lb_vorname.Items.Add(class_csatz.var_bname);
lb_nummer.Items.Add(class_csatz.var_number);
lb_ziffer.Items.Add(class_csatz.var_id);

fs_filepath.Close();

}
Jedes Detail wird in einer bestimmte Listbox ausgegeben. Jedoch wird damit nur der erste Datensatz ausgegeben.
Wie schaffe ich es, das alle Einträge mit einmal ausgegeben werden. Ich finde einfach keinen Ansatz, da ich mich mit der Ansteuerung der einzelnen Datensätze nicht so gut auskenne.

Bin für jede Hilfe dankbar!

MFG
The Keeper

robobimbo
2009-12-05, 13:29:30
einfach abfragen ob der stream nicht schon am ende ist

zb. so


byte[] data = System.IO.File.ReadAllBytes("D:\\phonebook.phb");
MemoryStream ms = new MemoryStream(data);
BinaryFormatter binaryFormatter = new BinaryFormatter();

while (ms.Position < data.Length)
{
CSatz entry = new CSatz();
entry = (CSatz)binaryFormatter.Deserialize(ms);
Console.WriteLine("Name: {0}, BName: {1}, Number: {2}, ID: {3}", entry.var_name, entry.var_bname, entry.var_number, entry.var_id);
}

The Keeper
2009-12-05, 16:04:10
Danke! Genau das wollte ich!

The Keeper
2009-12-05, 16:17:22
Das nächste Problem ist etwas schwieriger.

Ich möchte die Einträge in den ListBoxen nach Name bzw. Kennziffer sortieren.

Aber wenn eine ListBox ihre Reihenfolge ändert, sollen es die anderen ihr gleich tun. Ist dies möglich?

Sephiroth
2009-12-05, 16:57:49
dann nimm lieber ein listview anstatt mehrer listboxen und die spalten des listview sind die inhalte, die du derzeit in die listboxen verteilst.

robobimbo
2009-12-05, 17:28:46
Ich glaub was Du willst ist eher ein DataGridView - das stellt die richtigen Mechanismen zur Verfügung.

Als Datenquelle für ein DataGridView kannst Du auch eine ObjectSource nehmen, also eine Collection mit deinen Einträgen drinnen.

[edit] ups - zu spät :) ListView geht natürlich auch :)

The Keeper
2009-12-06, 12:44:49
okay ich guck mal wie ich das ListView anspreche

The Keeper
2009-12-06, 13:30:10
Das sieht mir schon recht kompliziert aus, wenn ich mich jetzt neu reinarbeiten muss. Soviel Zeit hab ich leider nicht mehr.

robobimbo
2009-12-06, 21:22:01
Dann bleibt dir nichts anderes über, als bei jeder Änderung den Inhalt aller ListBoxen zu löschen und alle in der gleichen (gewünschten) Reihenfolge wieder aufzubauen.

The Keeper
2009-12-08, 19:05:04
Okay, habs jetzt doch mit nem DataGridView realisiert. Hab aber noch eine Frage:

Wie kann ich das gesamte DataGridView leeren, ohne die Spalten zu löschen, damit ich diese wieder mit neuen Einträgen füllen kann?

Sephiroth
2009-12-08, 22:29:12
rowcount auf 0 setzen (http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridview.rowcount(VS.80).aspx) oder die clear() methode der DataGridViewRowCollection (http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewrowcollection_members(VS.80).aspx) aufrufen