我无法更新通过我的程序传递的信息。我使用以下代码来收集和设置数据。在幕后,它正确地更新到xml文件。我只能在重新启动程序时看到ui更新的形式。我希望我的程序的控件在后台工作完成后更新并显示,用新数据更新列表框,并从xml文件和堆栈读入。先感谢您。我希望我的问题不会太混乱。
XDocument document = XDocument.Load("Settings.xml");
XmlTextReader reader = new XmlTextReader("Settings.xml");
public static Stack list = new Stack();
public MainForm()
{
InitializeComponent();
ReadXml();
reader.Close();
foreach (string items in list)
{
listBox2.Items.Add(items);
}
}
public void WriteToXML()
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
using (XmlWriter writer = XmlWriter.Create("Settings.xml", settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("Folder_Settings");
if (DocumentsCheckbox.Checked == true)
{
writer.WriteElementString("Documents", "Checked");
}
else if (DocumentsCheckbox.Checked == false)
{
writer.WriteElementString("Documents", "Not Checked");
}
if (PicturesCheckBox.Checked == true)
{
writer.WriteElementString("Pictures", "Checked");
}
else if (PicturesCheckBox.Checked == false)
{
writer.WriteElementString("Pictures", "Not Checked");
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
}
}
public void ReadXml()
{
XmlNodeType type;
{
while (reader.Read())
{
type = reader.NodeType;
if (reader.Name == "Documents")
{
reader.Read();
if (reader.Value == "Checked")
{
DocumentsCheckbox.Checked = true;
list.Push(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
}
else if (reader.Value == "Not Checked")
{
DocumentsCheckbox.Checked = false;
}
}
if (reader.Name == "Pictures")
{
reader.Read();
if (reader.Value == "Checked")
{
PicturesCheckBox.Checked = true;
list.Push(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
}
else if (reader.Value == "Not Checked")
{
PicturesCheckBox.Checked = false;
}
}
}
}
private void ApplyButton_Click(object sender, EventArgs e)
{
WriteToXML();
ReadXml();
updateApplication.RunWorkerAsync();
}
private void updateApplication_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(10);
updateApplication.ReportProgress(i);
}
}
private void updateApplication_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ApplyProgressBar.Value = e.ProgressPercentage;
}
private void updateApplication_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ReadXml();
Refresh();
Application.DoEvents();
//this does not do what i want it too.
}
答案 0 :(得分:1)
XmlTextReader类是一个仅向前读者。一旦读到文件末尾,Read()将返回false。所以你第二次调用ReadXml()什么都不做。
而是在ReadXml中创建一个新的XmlTextReader对象并使用它。读者无需担任班级。这将确保您始终从磁盘读取当前文件。另请注意,XmlTextReader实现了IDisposable,因此它应该包含在using语句中。
答案 1 :(得分:0)
嗯,您在声明XmlTextReader对象的方式中有一个基本问题。你看到你正在调用MainForm()中的Close(),它会在加载Form后清除对象的所有资源 reader ,从而无法进一步使用它。因此,您必须重新启动程序才能看到更改。
我建议,就像您的 WriteToXML()一样,在 ReadXml()中声明 XmlTextReader 。不要忘记将调用转移到 close()也进入ReadXml(),因为一旦完成使用它就很重要。
或者,您也可以在ReadXml()内的using块中声明XmlTextReader。所以你不必担心关闭()。