Как заставить datagridview автоматически обновляться при изменении XML-файла? - PullRequest
1 голос
/ 10 июля 2010

Работая над приложением диспетчера паролей, я дошел до того, что оно будет принимать пользовательские данные из второй формы, записывать в файл XML, затем в первой форме анализировать данные xml и заполнять представление данных с помощью вся предоставленная пользователем информация об учетной записи. Пока работает отлично, но я хотел бы закодировать некоторые функции, которые обновляют отображение текущего dataGridview, если пользователь добавляет другую учетную запись, без необходимости повторного выбора группы учетных записей в поле со списком. В настоящее время он обновляется только для отображения вновь добавленной учетной записи после того, как пользователь выбирает группу учетных записей во второй раз. Как я могу изменить свой код, чтобы это исправить? Код выглядит следующим образом:

public partial class Form1 : Form
  {
    public string fileName = "passfile.xml";
    public DataSet ds = new DataSet("Account List");
    public DataTable accounts = new DataTable("Accounts");
    public Form1()
    {
        InitializeComponent();
        accountGroupsBox.Enabled = false;
        menuStrip1.Enabled = false;
        button2.Enabled = false;
        Types type = new Types();
        this.accountGroupsBox.Items.AddRange(type.accountTypes);
        accounts.Columns.AddRange(new DataColumn[] {
            new DataColumn("Username"),
            new DataColumn("Password"),
            new DataColumn("Description")});
        dataGridView1.DataSource = accounts;


    }

    private void addNewPasswordToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form2 addAccount = new Form2(this);
        addAccount.Show();
    }

    private void S_Click(object sender, EventArgs e)
    {
        accountGroupsBox.Enabled = true;
        menuStrip1.Enabled = true;
        button2.Enabled = true;
        label2.Text = "Interface Unlocked";

    }

    private void accountGroupsBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        accounts.Clear();
        XmlDocument doc = new XmlDocument();
        doc.Load(fileName);
        foreach (XmlNode node in doc.GetElementsByTagName("Account"))
        {
            if (node["AccountType"].InnerText == accountGroupsBox.SelectedItem.ToString())
            {
                DataRow row = accounts.Rows.Add(
                node["Username"].InnerText,
                node["Password"].InnerText,
                node["Description"].InnerText);
            }
        }


    }

А вот код для второй формы:

public partial class Form2 : Form
  {
    Form1 f;   
    public Form2(Form1 fr1)
    {
        InitializeComponent();
        f = new Form1();
        f = fr1;
        Types types = new Types();
        this.comboBox1.Items.AddRange(types.accountTypes);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string fileName = "passfile.xml";
        XmlDocument file = new XmlDocument();
        XmlTextReader read = new XmlTextReader(fileName);

        if (File.Exists(fileName))
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(fileName);
            XmlElement account = doc.CreateElement("Account");
            XmlElement type = doc.CreateElement("AccountType");
            type.InnerText = comboBox1.SelectedItem.ToString();
            XmlElement userName = doc.CreateElement("Username");
            userName.InnerText = textBox1.Text;
            XmlElement passWord = doc.CreateElement("Password");
            passWord.InnerText = textBox2.Text;
            XmlElement desc = doc.CreateElement("Description");
            desc.InnerText = textBox3.Text;
            account.AppendChild(type);
            account.AppendChild(userName);
            account.AppendChild(passWord);
            account.AppendChild(desc);
            doc.DocumentElement.InsertAfter(account, doc.DocumentElement.LastChild);
            doc.Save(fileName);
            f.dataGridView1.Update();
            this.Close();

        }
        else
        {
            XmlDocument doc = new XmlDocument();
            XmlElement account = doc.CreateElement("Account");
            XmlElement type = doc.CreateElement("AccountType");
            type.InnerText = comboBox1.SelectedItem.ToString();
            XmlElement userName = doc.CreateElement("Username");
            userName.InnerText = textBox1.Text;
            XmlElement passWord = doc.CreateElement("Password");
            passWord.InnerText = textBox2.Text;
            XmlElement desc = doc.CreateElement("Description");
            desc.InnerText = textBox3.Text;
            account.AppendChild(type);
            account.AppendChild(userName);
            account.AppendChild(passWord);
            account.AppendChild(desc);
            doc.AppendChild(account);
            doc.Save(fileName);
            this.Close();

        }
    }
}

}

1 Ответ

0 голосов
/ 11 июля 2010

лучшее решение, как я вижу, это установка наблюдателя файловой системы и прослушивание его событий:

вот пример кода о том, как его настроить (после добавления его в представление дизайна формы)

    private void SetFileWatcher()
    {

        fileSystemWatcher1.Path = System.IO.Path.GetDirectoryName(fileName);
        fileSystemWatcher1.Filter = System.IO.Path.GetFileName(fileName);
        fileSystemWatcher1.EnableRaisingEvents = true;
    }

и это пример события, которое вы можете добавить, чтобы дождаться изменения файла:

    void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
    {
        // for your code example, you can write the function here
        button1.PerformClick(); 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...