Here I register new sellers:
private void btn_läggtill_Click(object sender, EventArgs e)
{
string namn = txtn.Text;
double personnr;
if (!double.TryParse(txtp.Text, out personnr))
{
MessageBox.Show("personnummer måste vara ett tal");
return;
}
string distrikt = txtd.Text;
int antal = 0;
if (!int.TryParse(txta.Text, out antal))
{
MessageBox.Show("Antal måste vara ett tal");
return;
}
int nivå = 0;
if (antal < 50)
{
nivå = 1;
}
else if (antal >= 50 && antal <= 99)
{
nivå = 2;
}
else if (antal >= 100 && antal <= 199)
{
nivå = 3;
}
else
{
nivå = 4;
}
Säljare nySäljare = new Säljare(namn, personnr, distrikt, antal, nivå);
säljare.Add(nySäljare);
säljare = säljare.OrderBy(x => x.Nivå).ToList();
dgvViewsäljare.DataSource = säljare;
}
Here I save list of users into external file
private void btn_spara_Click(object sender, EventArgs e)
{
DialogResult resultat = dlgSparaSom.ShowDialog();
if (resultat == DialogResult.OK)
{
FileStream utStröm = new FileStream(dlgSparaSom.FileName, FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter skrivare = new BinaryWriter(utStröm);
int antalsäljare = säljare.Count;
skrivare.Write(antalsäljare);
for (int i = 0; i < säljare.Count; i )
{
skrivare.Write(säljare[i].Namn);
skrivare.Write(säljare[i].Personnr);
skrivare.Write(säljare[i].Distrikt);
skrivare.Write(säljare[i].Antal);
skrivare.Write(säljare[i].Nivå);
}
skrivare.Dispose();
}
}
Here is where the problem is, I can't open the file again:
private void btn_öppna_Click(object sender, EventArgs e)
{
DialogResult resultat = dlgÖppnaFil.ShowDialog();
if (resultat == DialogResult.OK)
{
FileStream inStröm = new FileStream(dlgÖppnaFil.FileName, FileMode.Open, FileAccess.Read);
BinaryReader läsare = new BinaryReader(inStröm);
int antalsäljare = läsare.ReadInt32();
for (int i = 0; i < antalsäljare; i )
{
string namn = läsare.ReadString();
double personnr = läsare.ReadSingle();
string distrikt = läsare.ReadString();
int antal = (int)läsare.ReadSingle();
int nivå = (int)läsare.ReadSingle();
Säljare nysäljare = new Säljare(namn, personnr, distrikt, antal, nivå);
säljare.Add(nysäljare);
dgvViewsäljare.Rows.Clear();
var col1 = new DataGridViewTextBoxColumn();
var col2 = new DataGridViewCheckBoxColumn();
var col3 = new DataGridViewTextBoxColumn();
var col4 = new DataGridViewCheckBoxColumn();
var col5 = new DataGridViewTextBoxColumn();
col1.HeaderText = "Namn";
col1.Name = "Column3";
col2.HeaderText = "Personnummer";
col2.Name = "Column4";
col3.HeaderText = "Distrikt";
col3.Name = "Column3";
col4.HeaderText = "Antal";
col4.Name = "Column3";
col5.HeaderText = "Nivå";
col5.Name = "Column3";
dgvViewsäljare.Columns.AddRange(new DataGridViewColumn[] { col1, col2, col3, col4, col5 });
dgvViewsäljare.Rows.Add(namn, personnr, distrikt, antal, nivå);
dgvViewsäljare.Rows[dgvViewsäljare.Rows.Count - 1].Tag = nysäljare;
}
läsare.Dispose();
}
}
When I click "open file" (btn_öppna_Click) I get:
Unable to read beyond the end of the stream.
@ string distrikt = läsare.ReadString();
Would highly appreciate responses and of course I'm here to edit if needed.
CodePudding user response:
This should probably do the trick:
string namn = läsare.ReadString();
double personnr = läsare.ReadDouble();
string distrikt = läsare.ReadString();
int antal = (int)läsare.ReadInt32();
int nivå = (int)läsare.ReadInt32();
The types need to be exactly the same.
CodePudding user response:
Try wrapping your streams around using(){} so that they dispose in order, and try closing your stream after accessing your file.
//Example:
using(FileStream utStröm = new FileStream(dlgSparaSom.FileName, FileMode.OpenOrCreate, FileAccess.Write)){
using(BinaryWriter skrivare = new BinaryWriter(utStröm)){
//Rest of the code here without skrivare.Dispose();
}
utStröm.Close();
}