除非重新启动

时间:2015-05-28 03:39:23

标签: c# winforms

我无法更新通过我的程序传递的信息。我使用以下代码来收集和设置数据。在幕后,它正确地更新到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.

        }

2 个答案:

答案 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。所以你不必担心关闭()