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.
        }

Winform ui将不会更新,除非重新启动

XmlTextReader类是一个只能转发的阅读器。一旦读取到文件的末尾,read()将返回false。因此,对ReadXml()的第二次调用什么也不做。

在ReadXml中创建一个新的XmlTextReader对象并使用它。读者不需要达到类的水平。这将确保您总是从一开始就从磁盘读取当前文件。还要注意,XmlTextReader实现了IDisposable,因此它应该包装在using语句中。

那么,在声明XmlTextReader对象的方式上有一个基本问题。你看到你在MainForm()中调用Close(),它清除对象的所有资源,reader,一旦Form被加载,因此你不能再使用它。因此,您必须重新启动程序才能看到更改。

我建议,就像你的WriteToXML(),在你的ReadXml()中声明XmlTextReader。不要忘记将对close()的调用移到ReadXml()中,因为在使用完后释放资源非常重要。

或者,您也可以在ReadXml()中的using块中声明XmlTextReader。所以你不必担心Close().