Winform ui将不会更新,除非重新启动
本文关键字:重新启动 更新 ui Winform | 更新日期: 2023-09-27 17:50:54
我在更新通过我的程序传递的信息时遇到麻烦。我使用下面的代码来收集和设置数据。在幕后,它正确地更新到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.
}
XmlTextReader类是一个只能转发的阅读器。一旦读取到文件的末尾,read()将返回false。因此,对ReadXml()的第二次调用什么也不做。
在ReadXml中创建一个新的XmlTextReader对象并使用它。读者不需要达到类的水平。这将确保您总是从一开始就从磁盘读取当前文件。还要注意,XmlTextReader实现了IDisposable,因此它应该包装在using语句中。
那么,在声明XmlTextReader对象的方式上有一个基本问题。你看到你在MainForm()中调用Close(),它清除对象的所有资源,reader,一旦Form被加载,因此你不能再使用它。因此,您必须重新启动程序才能看到更改。
我建议,就像你的WriteToXML(),在你的ReadXml()中声明XmlTextReader。不要忘记将对close()的调用移到ReadXml()中,因为在使用完后释放资源非常重要。
或者,您也可以在ReadXml()中的using块中声明XmlTextReader。所以你不必担心Close().