2015-02-09 98 views
0

我试图读取一个目录中存在的多个XML文件(每个XML只有一个记录)并在DataGridView中显示记录。如果任何XML文件使用新数据更新,我希望它的相应条目应该自动更新/刷新DataGridView中的新更新数据。做了一些搜索之后,我发现我可以使用FileSystemWatcher来查找是否有文件被更改,但任何人都可以帮助我如何使用它,我无法找到一个好例子。读取XML文件以在DataGridView中显示数据并自动更新UI(如果使用C来更改XML文件)#

我的XML文件看起来像(请注意,它没有根节点):

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<info> 
    <id>001</id> 
    <name>xyz</name> 
    <salary>1000</salary> 
    <phone>1234567890</phone> 
</info> 

我的C#代码读取XML和填充GridView控件如下:

using System.Xml; 
using System.IO; 

namespace XML_Reader 
{ 
    public partial class Form1 : Form 
    {   
     string[] fileArray; 
     string directory_path = "C:\\Users\\XYZ\\Desktop\\test\\";   

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //Add columns to empty datagridview 
      dataGridView1.Columns.Add("id", "id"); 
      dataGridView1.Columns.Add("name", "name"); 
      dataGridView1.Columns.Add("salary", "salary"); 
      dataGridView1.Columns.Add("phone", "phone"); 

      populateRecords(); 

     } 

     private void populateRecords() 
     { 
      DataSet ds; 
      DataGridViewRow dg_row; 

      //Read all XML files and records to datagrid 
      fileArray = Directory.GetFiles(directory_path, "MyFiles*.xml"); 
      foreach (string xmlFile in fileArray_collection) 
      { 
       //Read the XML from the file     
       ds = new DataSet(); 
       ds.ReadXml(xmlFile); 

       //create new row for datagrid 
       dg_row = (DataGridViewRow)dataGridView1.Rows[0].Clone(); 

       //assign values to cells in the new row 
       dg_row.Cells[0].Value = ds.Tables["info"].Rows[0]["id"]; 
       dg_row.Cells[1].Value = ds.Tables["info"].Rows[0]["name"]; 
       dg_row.Cells[2].Value = ds.Tables["info"].Rows[0]["salary"]; 
       dg_row.Cells[3].Value = ds.Tables["info"].Rows[0]["phone"];     

       //Add the new row to datagrid -- THE MOMENT RECORD IS DETECTED 
       dataGridView1.Rows.Add(dg_row); 

       dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;//This will keep the last added row visible with vertical scrollbar being at bottom. 
      }   
     } 
    } 
} 
+0

试试这个https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx – 2015-02-09 06:02:41

回答

2

你必须在您的课程文件中实施FileSystemWatcher

new System.IO.FileSystemWatcher m_Watcher = new System.IO.FileSystemWatcher(); 

然后,我们需要指定它的路径和过滤器来告诉对象,其中继续寻找。

m_Watcher.Path = "folder path"; 

接下来,我们需要告诉观察者看什么都在。

m_Watcher.Filter = strFilter; 

strFilter的应该是:

*.* - Watch all files in the Path *.ext - Watch files with the extension ext name.ext - Watch a particular file name.ext

接下来,我们需要告诉观察者寻找什么。

m_Watcher.NotifyFilter = NotifyFilters.LastAccess | 
        NotifyFilters.LastWrite | 
        NotifyFilters.FileName | 
        NotifyFilters.DirectoryName; 
m_Watcher.IncludeSubdirectories = true; 

接下来,我们需要描述需要时这些属性的人会改变做什么。

m_Watcher.Changed += new FileSystemEventHandler(OnChanged); 
m_Watcher.Created += new FileSystemEventHandler(OnChanged); 
m_Watcher.Deleted += new FileSystemEventHandler(OnChanged); 
m_Watcher.Renamed += new RenamedEventHandler(OnRenamed); 

void OnChanged(object sender, FileSystemEventArgs e) 
void OnRenamed(object sender, RenamedEventArgs e) 

**最后,我们需要告诉观察者完成它的工作 - 观看它! **

m_Watcher.EnableRaisingEvents = true; 

您可以使用提到的链接。 FileWatcher

+0

虽然这个链接可能回答这个问题,但它是更好的在这里包括答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – gknicker 2015-02-09 06:23:40

+0

@gknicker:你真的让我改变它的代码 – 2015-02-09 06:26:39