1

XMLファイルのデータを上書きしたくない古いデータと新しいデータをXMLファイルに保存したい。

私には3つのクラスがあります:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }       

    public Person()
    {
    }

    public override string ToString()
    {
        return FirstName + " " +LastName + "\t" +Email;
    }
}

public class Student : Person
{
    public Student()
    {
    }
    public double AssessmentGrade { get; set; }
    public double AssignmentGrade { get; set; }

    public override string ToString()
    {
        return base.ToString() + "," +AssessmentGrade + "," + AssignmentGrade;
    }
}

public class Teacher : Person
{
    public int RoomNumber { get; set; }

    public override string ToString()
    {
        return base.ToString() + "," + RoomNumber;
    }
}

PeronDB(クラス)からデータを呼び出すだけのクラスがもう1つあります

public class Persons
{
    private List<Person> persons = null;

      public void Save()
    {
        PersonDB.SavePersons(persons);
    }
 }

InPersonDBクラスデータ全体をXMLファイルに保存していますが、上書きされます

public class PersonDB
{
    private const string path = @"..\..\Persons.xml";


    public static void SavePersons(List<Person> Persons)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.IndentChars = ("   ");

        XmlWriter xmlOut = XmlWriter.Create(path, settings);

        xmlOut.WriteStartDocument();
        xmlOut.WriteStartElement("Persons");

        foreach (Person person in Persons)
        {

                if (typeof(Student).IsInstanceOfType(person))
                {
                    AppendStudentInfo(person, xmlOut);
                }
                else if (typeof(Teacher).IsInstanceOfType(person))
                {
                    AppendTeacherInfo(person, xmlOut);
                }
                else
                {
                    AppendPersonInfo(person, xmlOut);
                }
        }

        xmlOut.WriteEndElement();
        xmlOut.Close();
    }

そして、Form_Loadイベントで私は次のことを行っています。

    Persons personList = null;

    private void FillPersonlstBox()
    {
        Person p;
        listBox1.Items.Clear();
        for (int i = 0; i < personList.Count; i++)
        {
            p = personList[i];
            listBox1.Items.Add(p.ToString());
        }
    }

    private void Save_Click(object sender, EventArgs e)
    {
        HandleChange(personList);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        personList.Changed += new Persons.ChangeHandler(HandleChange);
    }

    private void HandleChange(Persons Persons)
    {
        Persons.Save();
        FillPersonlstBox();
    }

    private void Load_Click(object sender, EventArgs e)
    {
        personList.Changed += new Persons.ChangeHandler(HandleChange);
        personList.Fill();
        FillPersonlstBox();
    }

保存ボタンをクリックすると、データが上書きされ、古いデータが削除されて新しいデータが保存されます。最初の[ロード]ボタンを押してデータをロードし、その後さらにデータを追加しても、押しボタンを保存すると上書きされます。

4

1 に答える 1

1

PersonDBの定数にファイルパスがあります。代わりに、ファイルパスをSave()およびSavePersons()へのパラメーターにします。このようにして、ユーザーにファイル名の入力を求めて渡すか、メソッドに規則に基づいて名前を生成させることができます。

編集:

これは、SavePersonsの署名を変更して、パスをパラメーターとして含める例です。

public static void SavePersons(List<Person> Persons, String path)
{
//your code
}
于 2012-08-16T21:46:06.950 に答える