чтение списка из двоичного файла - PullRequest
1 голос
/ 28 июня 2011

Проблема, с которой я столкнулся, заключается в том, что я могу подготовить файл, но мой код чтения, кажется, читает только 1 значение из списка 2 значений.код следующий:

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;

 namespace test
 {

public partial class Form1 : Form
{
    [Serializable]
    public class ore
    {
        public float Cost;

    }



    private List<ore> oreData = new List<ore>();
    private ore b1 = null;
    private ore b2 = null;
    public Form1()
    {
        InitializeComponent();
        b1 = new ore();
        b2 = new ore();
        oreData.Add(b1);
        oreData.Add(b2);

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        // 1st text box input is float
        float tempFloat;


        if (float.TryParse(textBox1.Text, out tempFloat))
        {
            oreData[0].Cost = tempFloat;
        }
        else
            MessageBox.Show("uh oh");



    }


    private void textBox2_TextChanged(object sender, EventArgs e)
    {
        // 2nd text box input is float
        float tempFloat;
        if (float.TryParse(textBox1.Text, out tempFloat))
        {
            oreData[1].Cost = tempFloat;
        }
        else
            MessageBox.Show("uh oh");


    }


    private void button1_Click(object sender, EventArgs e)
    {
        FileStream fs = new FileStream("ore.dat", FileMode.Create);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs, oreData);
        fs.Close();
    }

    private void textBox3_TextChanged(object sender, EventArgs e)
    {
        // 3rd text box 
    }

    private void textBox4_TextChanged(object sender, EventArgs e)
    {
        //4th text box
    }


    private void button2_Click(object sender, EventArgs e)
    {
        FileStream fs = new FileStream("ore.dat", FileMode.Open);
        BinaryFormatter bf = new BinaryFormatter();
        oreData = (List<ore>)bf.Deserialize(fs);
        fs.Close();

        if (oreData!=null)
        {
            if (oreData.Count > 0)
                textBox3.Text = oreData[0].Cost.ToString();//update the 3rd text box
            if (oreData.Count > 1)
                textBox4.Text = oreData[1].Cost.ToString();//update the 4th text box

        }
    }
}
}

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Я нашел твою проблему! (О, мои глаза болят!)

Посмотрите на оператор if в ваших textbox1_changed и textbox2_changed методах. Они оба

if (float.TryParse(textBox1.Text, out tempFloat))

Но второй должен сказать

if (float.TryParse(textBox2.Text, out tempFloat))

Обратите внимание, что textbox1 заменено на textbox2. Это должно решить вашу проблему.

0 голосов
/ 28 июня 2011

Вам необходимо определить список и добавить в него элементы b1, b2, а затем при сериализации или десериализации данных десериализовать их в один и тот же список.

Примечание. Рекомендуется также переименовать текстовые поля и кнопки во что-то более удобочитаемое, например: textBox2 => FirstBookEpertonTextBox, textBox2_TextChanged => firstBookEpertonTextBox_TextChanged или OnFirstBookEpertonTextBox_TextChanged, button1 => saveBooksButton, Form1 => BooksMainForm ....

Обновление: Также рассмотрите возможность использования списка только вместо b1 и b2, например: books [0] вместо b1 и books [1] вместо b2 и т. Д., Если количество книг увеличивает удобство сопровождения кода не будет проблемой. обратите внимание, что вы используете список для сериализации и десериализации в любом случае.

[Serializable]
public class ore
{
    public float Cost;
}

private List<ore> books = new List<ore>(); // create a list at class level

public Form1()
{
    InitializeComponent();

    books.Add(new ore());
    books.Add(new ore());
}


private void textBox1_TextChanged(object sender, EventArgs e)
{
    // 1st text box input is float
    float tempFloat;
    if (float.TryParse(textBox1.Text, out tempFloat))
    {
        books[0].Cost = tempFloat;
    }
    else
        MessageBox.Show("uh oh");
}


private void textBox2_TextChanged(object sender, EventArgs e)
{
    // 2nd text box input is float
    float tempFloat;
    if (float.TryParse(textBox2.Text, out tempFloat))
    {
        books[1].Cost = tempFloat;
    }
    else
        MessageBox.Show("uh oh");
}

private void button1_Click(object sender, EventArgs e)
{
    FileStream fs = new FileStream("ore.dat", FileMode.Create);
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(fs, books);
    fs.Close();
}

private void button2_Click(object sender, EventArgs e)
{
    FileStream fs = new FileStream("ore.dat", FileMode.Open);
    BinaryFormatter bf = new BinaryFormatter();

    /*use the old list don't create new one 
    and also the new one you are creating has the same
    name as the class level one which may makes conflicts to you.*/
    books = (List<ore>)bf.Deserialize(fs);

    fs.Close();

    if (books!=null)
    {
        if (books.Count > 0)
        {
            //we don't need d1, d2 any more
            //b1 = books[0];
            textBox3.Text = books[0].Cost.ToString();
        }
        if (books.Count > 1)
        {
            //we don't need d1, d2 any more
            //b2 = books[1];
            textBox4.Text = books[1].Cost.ToString();
        }

    }
}
...