Всякий раз, когда я пытаюсь удалить запись из xml файла с помощью кнопки, она удаляет ее из формы, но она остается в файле xml. Другая проблема, которую я испытываю, заключается в следующем:
Я создаю пользователя в программе, он сохраняет файл xml. Я закрываю программу и загружаю ее в первый раз, когда я загружаю ее обратно после помещения записи там, где она читает правильно, и показывает, что находится в XML файле. Однако, если я закрываю и открываю программу снова и снова, она дублирует записи в XML файле снова и снова при каждом открытии.
Какие-либо предложения?
public partial class StaffCreate : Form
{
public StaffCreate()
{
InitializeComponent();
}
List<Person> people = new List<Person>();
private void StaffCreate_Load(object sender, EventArgs e)
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (!Directory.Exists(path + "\\stockbox Documents"))
Directory.CreateDirectory(path + "\\stockbox Documents");
if (!File.Exists(path + "\\stockbox Documents\\People_File.xml"))
{
XmlTextWriter xWriter = new XmlTextWriter(path + "\\stockbox Documents\\People_File.xml", Encoding.UTF8);
xWriter.WriteStartElement("People");
xWriter.WriteEndElement();
xWriter.Close();
}
XmlDocument xDoc = new XmlDocument();
xDoc.Load(path + "\\stockbox Documents\\People_File.xml");
foreach (XmlNode xNode in xDoc.SelectNodes("People/Person"))
{
Person p = new Person();
p.name = xNode.SelectSingleNode("Name").InnerText;
p.pass = xNode.SelectSingleNode("Password").InnerText;
p.title = xNode.SelectSingleNode("Title").InnerText;
people.Add(p);
listView1.Items.Add(p.name);
}
}
private void button2_Click(object sender, EventArgs e)
{
Person p = new Person();
p.name = nameTxt.Text;
p.pass = passTxt.Text;
p.title = titleTxt.Text;
people.Add(p);
listView1.Items.Add(p.name);
nameTxt.Text = "";
passTxt.Text = "";
titleTxt.Text = "";
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
nameTxt.Text = people[listView1.SelectedItems[0].Index].name;
passTxt.Text = people[listView1.SelectedItems[0].Index].pass;
titleTxt.Text = people[listView1.SelectedItems[0].Index].title;
}
}
private void button3_Click(object sender, EventArgs e)
{
remove();
nameTxt.Text = "";
passTxt.Text = "";
titleTxt.Text = "";
}
void remove()
{
try
{
people.RemoveAt(listView1.SelectedItems[0].Index);
listView1.Items.Remove(listView1.Items[0]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
people[listView1.SelectedItems[0].Index].name = nameTxt.Text;
people[listView1.SelectedItems[0].Index].pass = passTxt.Text;
people[listView1.SelectedItems[0].Index].title = titleTxt.Text;
listView1.SelectedItems[0].Text = nameTxt.Text;
}
private void StaffCreate_FormClosing(object sender, FormClosingEventArgs e)
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
XmlDocument xDocument = new XmlDocument();
xDocument.Load(path + "\\stockbox Documents\\People_File.xml");
XmlNode xNode = xDocument.SelectSingleNode("People");
foreach (Person p in people)
{
XmlNode xTnode = xDocument.CreateElement("Person");
XmlNode xName = xDocument.CreateElement("Name");
XmlNode xPass = xDocument.CreateElement("Password");
XmlNode xTitle = xDocument.CreateElement("Title");
xName.InnerText = p.name;
xPass.InnerText = p.pass;
xTitle.InnerText = p.title;
xTnode.AppendChild(xName);
xTnode.AppendChild(xPass);
xTnode.AppendChild(xTitle);
xDocument.DocumentElement.AppendChild(xTnode);
}
xDocument.Save(path + "\\stockbox Documents\\People_File.xml");
}
}
class Person
{
public string name
{
get;
set;
}
public string pass
{
get;
set;
}
public string title
{
get;
set;
}
}
}
В StaffCreate_FormClosing
вы xDocument
существующим содержимым файла (xDocument.Load
), а затем добавляете все в памяти в цикле for
, которое содержит все, что было в файле, когда оно было загружено (дублирует минус удаленные элементы плюс добавлено Предметы). В результате все, что не было удалено, добавляется дважды. Если у вас есть все в памяти, нет необходимости загружать из файла - вы не хотите ни одного из них.
Вы должны либо очищать содержимое файла xml каждый раз, либо отслеживать те nodes
которые в ваших кодах, статусах этих персонажей: были ли они созданы в последнее время или загружены из существующего XML файла. Может быть, это немного простая вещь "ORM".
И, возможно, использовать Path.Combine()
лучше, чем комбинацию строк пути вручную
В вашем методе StaffCreate_FormClosing вы загружаете файл и добавляете новые узлы для всех объектов пользователей, находящихся в настоящее время в памяти. Удаление всех детей из узла пользователя (xnode) перед добавлением должно делать трюк.